天水网站建设公司排名,株洲网站建设方案,做搬家服务网站问卷调查结果,关于工程项目建设的网站登录校验-Filter
分析
过滤器Filter的快速入门以及使用细节我们已经介绍完了#xff0c;接下来最后一步#xff0c;我们需要使用过滤器Filter来完成案例当中的登录校验功能。 我们先来回顾下前面分析过的登录校验的基本流程#xff1a; 要进入到后台管理系统#xff0c;我…登录校验-Filter
分析
过滤器Filter的快速入门以及使用细节我们已经介绍完了接下来最后一步我们需要使用过滤器Filter来完成案例当中的登录校验功能。 我们先来回顾下前面分析过的登录校验的基本流程 要进入到后台管理系统我们必须先完成登录操作此时就需要访问登录接口login。 登录成功之后我们会在服务端生成一个JWT令牌并且把JWT令牌返回给前端前端会将JWT令牌存储下来。 在后续的每一次请求当中都会将JWT令牌携带到服务端请求到达服务端之后要想去访问对应的业务功能此时我们必须先要校验令牌的有效性。 对于校验令牌的这一块操作我们使用登录校验的过滤器在过滤器当中来校验令牌的有效性。如果令牌是无效的就响应一个错误的信息也不会再去放行访问对应的资源了。如果令牌存在并且它是有效的此时就会放行去访问对应的web资源执行相应的业务操作。
大概清楚了在Filter过滤器的实现步骤了那在正式开发登录校验过滤器之前我们思考两个问题 所有的请求拦截到了之后都需要校验令牌吗 答案登录请求例外 拦截到请求后什么情况下才可以放行执行业务操作 答案有令牌且令牌校验通过(合法)否则都返回未登录错误结果
具体流程
我们要完成登录校验主要是利用Filter过滤器实现而Filter过滤器的流程步骤 基于上面的业务流程我们分析出具体的操作步骤
获取请求url判断请求url中是否包含login如果包含说明是登录操作放行获取请求头中的令牌token判断令牌是否存在如果不存在返回错误结果未登录解析token如果解析失败返回错误结果未登录放行
代码实现
分析清楚了以上的问题后我们就参照接口文档来开发登录功能了登录接口描述如下 请求参数 参数格式application/json 参数说明 名称类型是否必须备注usernamestring必须用户名passwordstring必须密码请求数据样例 {username: jinyong,password: 123456
}响应数据 参数格式application/json 参数说明 名称类型是否必须默认值备注其他信息codenumber必须响应码, 1 成功 ; 0 失败msgstring非必须提示信息datastring必须返回的数据 , jwt令牌响应数据样例 {code: 1,msg: success,data: eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi6YeR5bq4IiwiaWQiOjEsInVzZXJuYW1lIjoiamlueW9uZyIsImV4cCI6MTY2MjIwNzA0OH0.KkUc_CXJZJ8Dd063eImx4H9Ojfrr6XMJ-yVzaWCVZCo
}备注说明 用户登录成功后系统会自动下发JWT令牌然后在后续的每次请求中都需要在请求头header中携带到服务端请求头的名称为 token 值为 登录时下发的JWT令牌。 如果检测到用户未登录则会返回如下固定错误信息 {code: 0,msg: NOT_LOGIN,data: null
}登录校验过滤器LoginCheckFilter
Slf4j
WebFilter(urlPatterns /*) //拦截所有请求
public class LoginCheckFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {//前置强制转换为http协议的请求对象、响应对象 转换原因要使用子类中特有方法HttpServletRequest request (HttpServletRequest) servletRequest;HttpServletResponse response (HttpServletResponse) servletResponse;//1.获取请求urlString url request.getRequestURL().toString();log.info(请求路径{}, url); //请求路径http://localhost:8080/login//2.判断请求url中是否包含login如果包含说明是登录操作放行if(url.contains(/login)){chain.doFilter(request, response);//放行请求return;//结束当前方法的执行}//3.获取请求头中的令牌tokenString token request.getHeader(token);log.info(从请求头中获取的令牌{},token);//4.判断令牌是否存在如果不存在返回错误结果未登录if(!StringUtils.hasLength(token)){log.info(Token不存在);Result responseResult Result.error(NOT_LOGIN);//把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)String json JSONObject.toJSONString(responseResult);response.setContentType(application/json;charsetutf-8);//响应response.getWriter().write(json);return;}//5.解析token如果解析失败返回错误结果未登录try {JwtUtils.parseJWT(token);}catch (Exception e){log.info(令牌解析失败!);Result responseResult Result.error(NOT_LOGIN);//把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)String json JSONObject.toJSONString(responseResult);response.setContentType(application/json;charsetutf-8);//响应response.getWriter().write(json);return;}//6.放行chain.doFilter(request, response);}
}JWT导入的maven依赖
!--JWT令牌--dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.1/version/dependencyJWT的工具类 import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey shisan;private static Long expire 43200000L;/*** 生成JWT令牌* param claims JWT第二部分负载 payload 中存储的内容* return*/public static String generateJwt(MapString, Object claims){String jwt Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() expire)).compact();return jwt;}/*** 解析JWT令牌* param jwt JWT令牌* return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}在上述过滤器的功能实现中我们使用到了一个第三方json处理的工具包fastjson。我们要想使用需要引入如下依赖
dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.76/version
/dependency登录校验的过滤器我们编写完成了接下来我们就可以重新启动服务来做一个测试 测试前先把之前所编写的测试使用的过滤器暂时注释掉。直接将WebFilter注解给注释掉即可。 测试1未登录是否可以访问部门管理页面 首先关闭浏览器重新打开浏览器在地址栏中输入http://localhost:9528/#/system/dept 由于用户没有登录登录校验过滤器返回错误信息前端页面根据返回的错误信息结果自动跳转到登录页面了 测试2先进行登录操作再访问部门管理页面 登录校验成功之后可以正常访问相关业务操作页面 总结 这个过滤器检查请求的URL是否包含 “login”。如果包含则直接允许请求继续。如果不包含 “login”则检查JWT令牌的存在和有效性。如果令牌不存在或无效返回一个JSON格式的 “NOT_LOGIN” 错误响应。如果令牌存在并且有效则允许请求继续。