前言:
作者简介:我是笑霸final,一名热爱技术的在校学生。
个人主页:个人主页1 || 笑霸final的主页2
系列专栏:后端专栏
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
如果感觉博主的文章还不错的话,点赞 + 关注 + 收藏
啥是登录校验?
常见的登录校验
分布式之session共享问题 4种解决方案及spring session的使用
这里推荐 做时间的朋友。
的一篇文章点此跳转
https://blog.csdn.net/weixin_44335140/article/details/112994824
J
SON W
eb T
oken (https:/ /jwt.io/
)JWT的登录场景
右上面可知我们就需要实现生成jwt令牌
和实现一个统一拦截 校验
一、引入依赖
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>0.9.0version>
dependency>
然后就能使用提供的 Jwts
工具类了
二、生成JWT
String JWTString = Jwts.builder()//生成jwt令牌
.signWith(SignatureAlgorithm.HS256, "xbfinal")// 签名算法和密钥
.setClaims(hashMap)//存储自定义的数据(载荷)
//System.currentTimeMillis()获取当前时间毫秒值 一下表示当前时间后的一个小时
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//有效期 1小时
.compact();
System.out.println(JWTString);
Claims keyBody = Jwts.parser()
.setSigningKey("xbfinal")//签名密钥
//传入生成的 jwt令牌
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi56yR6Zy4ZmluYWwiLCJleHAiOjE2ODEzNTQxMTcsImFnZSI6IjE4In0.77CDL0t1yFGDeXvM9pH5TKT1Pt5Xq6rUdycl4yPCC6Q")
.getBody();//拿到我们自定义的内容
Map<String, Object> stringObjectMap = BeanUtil.beanToMap(keyBody);
System.out.println(stringObjectMap.get("name"));
System.out.println(keyBody);
@Slf4j
@WebFilter(urlPatterns = "/*") //别忘了 启动类加上@ServletComponentScan注解
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取请求url
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
String requestURL = req.getRequestURL().toString();
log.info("请求地址{}",requestURL);
//判断是不是登录请求?是的话就放行
if(requestURL.contains("doLogin")){
log.info("登录放行");
filterChain.doFilter(servletRequest,servletResponse);
return;//返回的时候直接返回 不执行下面的代码
}
//获取请求头中的token
String jwt = req.getHeader("JWTStr");
//验证令牌
if(StrUtil.isEmpty(jwt)){
//不存在
log.info("token为空");
String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
res.getWriter().write(jsonStr);
return;
}
try{
Claims parser = MyJwtUtils.parser(jwt);
}catch (Exception e){
log.info("token为空");
String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
response.getWriter().write(jsonStr);
return;
}
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
注意
:需要前端把jwt放入请求头中
@Slf4j
@Component //拦截器配置好后别忘了注册
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求头中的token
String jwt = request.getHeader("satoken");
//验证令牌
if(StrUtil.isEmpty(jwt)){
//不存在
log.info("token为空");
String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
response.getWriter().write(jsonStr);
return false;
}
try{
Claims parser = MyJwtUtils.parser(jwt);
}catch (Exception e){
log.info("token为空");
String jsonStr = JSONUtil.toJsonStr(SaResult.error("没有登录").toString());
response.getWriter().write(jsonStr);
return false;
}
//放行
log.info("登录放行");
return true;
}
注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
LoginCheckInterceptor loginCheckInterceptor;
/**
* 注册拦截器的方法
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**")//拦截所以资源
.excludePathPatterns("/user/doLogin/**")//排除路径
// .order(1) 有多个拦截器的话设置优先级 数字越小优先级越高
;
}
}
注意
:需要前端把jwt放入请求头中