这里只供参考,比较使用jwt方式进行身份验证感觉不好,最不行的就是不能退出
登陆时设定多长过期时间,只能等这个时间过了以后才算退出,服务端只能验证请求过来的令牌是否通过验证
代码:
/* * *由qhong> @Target (ElementType.PARAMETER) @Retention (RetentionPolicy.RUNTIME) 公共@ interface LoginUser { } >之前JwtUtil:
@ConfigurationProperties(前缀=癹wt”) @ component 公开课JwtUtils { 私人日志记录器=LoggerFactory.getLogger (getClass ()); 私人秘密字符串; 私人长到期; 私人字符串头;/* * *生成jwt令牌 */公共字符串generateToken(长userId) { 日期nowDate=new日期();//过期时间 日期相匹配=new日期(nowDate.getTime() + * 1000年到期); 返回Jwts.builder () .setHeaderParam (typ”、“JWT”) .setSubject (userId + " ") .setIssuedAt (nowDate) .setExpiration(相) .signWith (io.jsonwebtoken.SignatureAlgorithm。HS512秘密) .compact (); } 公开声称getClaimByToken(字符串标记){ 尝试{ 返回Jwts.parser () .setSigningKey(秘密) .parseClaimsJws(令牌) .getBody (); }捕捉(异常e) { logger.debug(“验证令牌错误”,e); 返回null; } }/* * *标记是否过期 * @return真的:过期 */公共布尔isTokenExpired(过期日期){ 返回过期。(新日期之前()); } 公共字符串getSecret () { 返回的秘密; } 公共空间setSecret(字符串秘密){ 这一点。秘密=秘密; } 公共长getExpire () { 返回到期; } 公共空间setExpire(长到期){ 这一点。到期=到期; } 公共字符串getHeader () { 返回头; } 公共空间setHeader(字符串头){ 这一点。头=头; } } >之前application.properties配置:
#加密秘钥 jwt.secret=f4e2e52034348f86b67cde581c0f9eb5 #令牌有效时长,单位秒 jwt.expire=60000 jwt.header=标记拦截器:
/* * *由qhong> @ component 公共类LoginUserHandlerMethodArgumentResolver实现HandlerMethodArgumentResolver { @ autowired 私人UserService UserService; @Override 公共布尔supportsParameter (MethodParameter参数){ 返回parameter.getParameterType () .isAssignableFrom (User.class),,parameter.hasParameterAnnotation (LoginUser.class); } @Override 公共对象resolveArgument (MethodParameter参数,ModelAndViewContainer容器, NativeWebRequest请求,WebDataBinderFactory工厂){抛出异常//获取用户ID 对象对象=request.getAttribute (AuthorizationInterceptor。USER_KEY RequestAttributes.SCOPE_REQUEST); 如果(对象==null) { 返回null; }//获取用户信息 用户用户=userService.selectById((长)对象); 返回用户; } }WebConfig:
@ configuration 公开课WebConfig延伸WebMvcConfigurerAdapter { @ autowired 私人AuthorizationInterceptor AuthorizationInterceptor; @ autowired 私人LoginUserHandlerMethodArgumentResolver LoginUserHandlerMethodArgumentResolver; @Override 公共空间addInterceptors (InterceptorRegistry注册表){ registry.addInterceptor (authorizationInterceptor) .addPathPatterns (“/* *”); } @Override 公共空间addArgumentResolvers (List登录:argumentResolvers) { argumentResolvers.add (loginUserHandlerMethodArgumentResolver); } }
@PostMapping("/登录”) @AuthIgnore 公共R login2 (@RequestBody用户u) {//用户登录 长userId=userService.addUser (u);//生成令牌 字符串标记=jwtUtils.generateToken (userId); Object> Map<字符串;地图=new HashMap<在(); 地图。把(“令牌”,令牌); 地图。put(“过期”,jwtUtils.getExpire ()); 返回R.ok(地图); }LoginUser注解使用:
@RequestMapping (value=" https://www.yisu.com/query2 ",方法=RequestMethod.POST) 公共用户Query2 (@LoginUser用户u) { 回报你; }SpringBoot使用jwt进行身份验证的方法示例