今天是写外卖的第一天,昨天主要就下载了下资料,并且配置了前端环境后端环境

我用接口测试没有用黑马的yapi 用的是apifox 也挺好用的 推荐!!!!!

目录

今日完结任务:

1.新增员工

2.分页查询

3.启用禁用员工账号一点小细节

4.分类管理接口

5.补充

1.http

2.jwt.令牌登录

总结:


今日完结任务:

  1. 新增员工接口
  2. 分页查询
  3. 启用禁用员工账号
  4. 分类管理
  5. 其他补充

1.新增员工

在新增员工这里用到了一个ThreadLocal

我们在spring后端发起的每一个请求,都是一个独自的线程

线程安全性:  ThreadLocal 本身为每个线程提供独立的变量副本,因此是线程安全的,但需确保不同线程之间不会错误地修改对方的数据。

在使用后必须remove该线程,不然可能会造成内存泄漏

2.分页查询

运用了pagehelper插件实现分页查询,这样就不用在sql中再写limit了

 在xml中写sql语句时,利用分页插件实现分页查询,这里使用了动态sql <where> 标签会智能处理:只有当至少有一个条件满足时,才会插入 WHERE 关键字会自动删除条件开头多余的 AND 或 OR所以无论哪个条件满足,生成的 SQL 都是正确的

还有一点小小的问题, <if test="name != null and name != ''"> 判断空得是'' 不能是' '

3.启用禁用员工账号一点小细节

parameterType 是 MyBatis XML 映射文件中的一个重要属性,用于指定传入 SQL 语句的参数类型。

基本作用:  parameterType 告诉 MyBatis:这个 SQL 语句将会接收什么类型的参数。

4.分类管理接口

和员工管理的接口很像crud

5.补充

1.http
请求简单介绍

对于http协议

请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体

    get请求只有请求行和请求体

    post请求则是三个都有

    1)请求行:请求方式、资源路径、协议/版本组成(之间使用空格分隔)

    2)请求头:

  Host 表示请求的主机名
User-Agent 浏览器版本。 例如:Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko
Accept 表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding 表示浏览器可以支持的压缩类型,例如gzip, deflat
Content-Type 请求主体的数据类型
Content-Length 数据主体的大小(单位:字节)

                     偶尔还带token

  3)请求体:则是post请求里面带的参数

2.响应

响应几乎是一样的:响应行,响应头, 响应体

1)响应行: 协议及版本、响应状态码、状态码描述  

2)响应头:

Content-Type 表示该响应内容的类型,例如text/html,image/jpeg 
Content-Length 表示该响应内容的长度(字节数);
Content-Encoding 表示该响应压缩算法,例如gzip ;
Cache-Control: 指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ;
Set-Cookie: 告诉浏览器为当前页面所在的域设置cookie  


 3)响应体 :响应数据

状态码分类    说明
1xx    响应中 --- 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略
2xx    成功 --- 表示请求已经被成功接收,处理已完成
3xx    重定向 --- 重定向到其它地方,让客户端再发起一个请求以完成整个处理
4xx    客户端错误 --- 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx    服务器端错误 --- 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等
2.jwt.令牌登录

JWT全称 JSON Web Token (官网:https://jwt.io/

JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)

- 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}

- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。

jwt就是把三个部分进行了base64编码,xxxxxxx.yyyyyyy.zzzzzz,x就是头部,y就是负载,z就是签名签名 = HA256( base64(header) + "." + base64(payload), 你的密钥 ) 然后将签名附在JWT的第三部分。这个签名是Header和Payload的“数字指纹”。

这个密钥是你自己所设置的,利用密钥才有可能解密第三部分,这样验证时只有一样的令牌才会通过,如果不一样就会拒绝(检验作用)

另外,在登陆时会用到两个技术(都可以用)对令牌进行验证

Filter过滤器

Interceptor拦截器

讲解:

1)先自定义拦截器

实现HandlerInterceptor接口,并重写其所有方法

//自定义拦截器
@Component
public class DemoInterceptor implements HandlerInterceptor {
    //目标资源方法执行前执行。 返回true:放行    返回false:不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle .... ");
        
        return true; //true表示放行
    }

    //目标资源方法执行后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ... ");
    }

    //视图渲染完毕后执行,最后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion .... ");
    }
}

注意:

  • preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行

  • postHandle方法:目标资源方法执行后执行

  • afterCompletion方法:视图渲染完毕后执行,最后执行

2). 注册配置拦截器

public class WebConfig implements WebMvcConfigurer {

    //自定义的拦截器对象
    @Autowired
    private DemoInterceptor demoInterceptor;

    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //注册自定义拦截器对象
        registry.addInterceptor(demoInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
    }
}

这里也是可以设置不拦截那些路径的

实例:

**
 * jwt令牌校验的拦截器
 */
@Component
@Slf4j
public class JwtTokenUserInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtProperties jwtProperties;

    /**
     * 校验jwt
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法,直接放行
            return true;
        }

        //1、从请求头中获取令牌
        String token = request.getHeader(jwtProperties.getUserTokenName());

        //2、校验令牌
        try {
            log.info("jwt校验:{}", token);
            Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
            Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
            log.info("当前用户的id:", userId);
            BaseContext.setCurrentId(userId);
            //3、通过,放行
            return true;
        } catch (Exception ex) {
            //4、不通过,响应401状态码
            response.setStatus(401);
            return false;
        }
    }
}
**
 * 配置类,注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;

  /**
     * 注册自定义拦截器
     *
     * @param registry
     */
    protected void addInterceptors(InterceptorRegistry registry) {
        log.info("开始注册自定义拦截器...");
        registry.addInterceptor(jwtTokenAdminInterceptor)
                .addPathPatterns("/admin/**")
                .excludePathPatterns("/admin/employee/login");
      
    }

总结:

今天到此结束!!!!!!!!!!!!!!!!!!!!!!

Logo

更多推荐