当前位置:   article > 正文

【JavaWeb】Day66.Springboot案例——过滤器Filter实现_springboot filter 拦截返回错误信息

springboot filter 拦截返回错误信息

登录校验-Filter

分析

使用过滤器Filter来完成案例当中的登录校验功能。

登录校验的基本流程:

- 要进入到后台管理系统,我们必须先完成登录操作,此时就需要访问登录接口login。

- 登录成功之后,我们会在服务端生成一个JWT令牌,并且把JWT令牌返回给前端,前端会将JWT令牌存储下来。

- 在后续的每一次请求当中,都会将JWT令牌携带到服务端,请求到达服务端之后,要想去访问对应的业务功能,此时我们必须先要校验令牌的有效性。

- 对于校验令牌的这一块操作,我们使用登录校验的过滤器,在过滤器当中来校验令牌的有效性。如果令牌是无效的,就响应一个错误的信息,也不会再去放行访问对应的资源了。如果令牌存在,并且它是有效的,此时就会放行去访问对应的web资源,执行相应的业务操作。

具体流程

我们要完成登录校验,主要是利用Filter过滤器实现,而Filter过滤器的流程步骤:

基于上面的业务流程,我们分析出具体的操作步骤:

1. 获取请求url

2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行

3. 获取请求头中的令牌(token)

4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)

5. 解析token,如果解析失败,返回错误结果(未登录)

6. 放行

代码实现

基本信息

  请求路径:/login

  请求方式:POST

  接口描述:该接口用于员工登录Tlias智能学习辅助系统,登录完毕后,系统下发JWT令牌。

请求参数

  参数格式:application/json

  参数说明:

  请求数据样例:

  1. ~~~json
  2. {
  3. "username": "jinyong",
  4. "password": "123456"
  5. }
  6. ~~~

响应数据

  参数格式:application/json

  参数说明:

  响应数据样例:

  1. ~~~json
  2. {
  3. "code": 1,
  4. "msg": "success",
  5. "data": "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsInVzZXJuYW1lIjoiamlueW9uZyIsImV4cCI6MTY2MjIwNzA0OH0.KkUc_CXJZJ8Dd063eImx4H9Ojfrr6XMJ-yVzaWCVZCo"
  6. }
  7. ~~~

备注说明:

  用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,都需要在请求头header中携带到服务端,请求头的名称为 token ,值为 登录时下发的JWT令牌。

  如果检测到用户未登录,则会返回如下固定错误信息:

  1. ~~~json
  2. {
  3. "code": 0,
  4. "msg": "NOT_LOGIN",
  5. "data": null
  6. }
  7. ~~~

登录校验过滤器:LoginCheckFilter

  1. ~~~java
  2. @Slf4j
  3. @WebFilter(urlPatterns = "/*") //拦截所有请求
  4. public class LoginCheckFilter implements Filter {
  5. @Override
  6. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
  7. //前置:强制转换为http协议的请求对象、响应对象 (转换原因:要使用子类中特有方法)
  8. HttpServletRequest request = (HttpServletRequest) servletRequest;
  9. HttpServletResponse response = (HttpServletResponse) servletResponse;
  10. //1.获取请求url
  11. String url = request.getRequestURL().toString();
  12. log.info("请求路径:{}", url); //请求路径:http://localhost:8080/login
  13. //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
  14. if(url.contains("/login")){
  15. chain.doFilter(request, response);//放行请求
  16. return;//结束当前方法的执行
  17. }
  18. //3.获取请求头中的令牌(token)
  19. String token = request.getHeader("token");
  20. log.info("从请求头中获取的令牌:{}",token);
  21. //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
  22. if(!StringUtils.hasLength(token)){
  23. log.info("Token不存在");
  24. Result responseResult = Result.error("NOT_LOGIN");
  25. //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
  26. String json = JSONObject.toJSONString(responseResult);
  27. response.setContentType("application/json;charset=utf-8");
  28. //响应
  29. response.getWriter().write(json);
  30. return;
  31. }
  32. //5.解析token,如果解析失败,返回错误结果(未登录)
  33. try {
  34. JwtUtils.parseJWT(token);
  35. }catch (Exception e){
  36. log.info("令牌解析失败!");
  37. Result responseResult = Result.error("NOT_LOGIN");
  38. //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
  39. String json = JSONObject.toJSONString(responseResult);
  40. response.setContentType("application/json;charset=utf-8");
  41. //响应
  42. response.getWriter().write(json);
  43. return;
  44. }
  45. //6.放行
  46. chain.doFilter(request, response);
  47. }
  48. }
  49. ~~~

在上述过滤器的功能实现中,我们使用到了一个第三方json处理的工具包fastjson。我们要想使用,需要引入如下依赖:

  1. ```xml
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.76</version>
  6. </dependency>
  7. ```

登录校验的过滤器我们编写完成了,接下来我们就可以重新启动服务来做一个测试:

测试1:未登录是否可以访问部门管理页面

        首先关闭浏览器,重新打开浏览器,在地址栏中输入:http://localhost:90/#/system/dept

        由于用户没有登录,登录校验过滤器返回错误信息,前端页面根据返回的错误信息结果,自动跳转到登录页面了

测试2:先进行登录操作,再访问部门管理页面

登录校验成功之后,可以正常访问相关业务操作页面

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/1000741
推荐阅读
相关标签
  

闽ICP备14008679号