麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

SpringBoot 使用jwt進行身份驗證的方法示例

2024-07-14 08:43:17
字體:
來源:轉載
供稿:網友

這里只供參考,比較使用jwt方式進行身份驗證感覺不好,最不行的就是不能退出

登陸時設定多長過期時間,只能等這個時間過了以后才算退出,服務端只能驗證請求過來的token是否通過驗證

Code:

/** * Created by qhong on 2018/6/7 15:34 * 標注該注解的,就不需要登錄 **/@Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface AuthIgnore {}

LoginUser:

@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface LoginUser {}

JwtUtil:

@ConfigurationProperties(prefix = "jwt")@Componentpublic class JwtUtils {  private Logger logger = LoggerFactory.getLogger(getClass());  private String secret;  private long expire;  private String header;  /**   * 生成jwt token   */  public String generateToken(long userId) {    Date nowDate = new Date();    //過期時間    Date expireDate = new Date(nowDate.getTime() + expire * 1000);    return Jwts.builder()        .setHeaderParam("typ", "JWT")        .setSubject(userId+"")        .setIssuedAt(nowDate)        .setExpiration(expireDate)        .signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, secret)        .compact();  }  public Claims getClaimByToken(String token) {    try {      return Jwts.parser()          .setSigningKey(secret)          .parseClaimsJws(token)          .getBody();    }catch (Exception e){      logger.debug("validate is token error ", e);      return null;    }  }  /**   * token是否過期   * @return true:過期   */  public boolean isTokenExpired(Date expiration) {    return expiration.before(new Date());  }  public String getSecret() {    return secret;  }  public void setSecret(String secret) {    this.secret = secret;  }  public long getExpire() {    return expire;  }  public void setExpire(long expire) {    this.expire = expire;  }  public String getHeader() {    return header;  }  public void setHeader(String header) {    this.header = header;  }}

application.properties配置:

# 加密秘鑰jwt.secret=f4e2e52034348f86b67cde581c0f9eb5# token有效時長,單位秒jwt.expire=60000jwt.header=token

攔截器:

/** * Created by qhong on 2018/6/7 15:36 **/@Componentpublic class AuthorizationInterceptor extends HandlerInterceptorAdapter {  @Autowired  private JwtUtils jwtUtils;  public static final String USER_KEY = "userId";  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    AuthIgnore annotation;    if(handler instanceof HandlerMethod) {      annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthIgnore.class);    }else{      return true;    }    //如果有@AuthIgnore注解,則不驗證token    if(annotation != null){      return true;    }    //獲取用戶憑證    String token = request.getHeader(jwtUtils.getHeader());    if(StringUtils.isBlank(token)){      token = request.getParameter(jwtUtils.getHeader());    }    //token憑證為空    if(StringUtils.isBlank(token)){      throw new AuthException(jwtUtils.getHeader() + "不能為空", HttpStatus.UNAUTHORIZED.value());    }    Claims claims = jwtUtils.getClaimByToken(token);    if(claims == null || jwtUtils.isTokenExpired(claims.getExpiration())){      throw new AuthException(jwtUtils.getHeader() + "失效,請重新登錄", HttpStatus.UNAUTHORIZED.value());    }    //設置userId到request里,后續根據userId,獲取用戶信息    request.setAttribute(USER_KEY, Long.parseLong(claims.getSubject()));    return true;  }}

注解攔截:

@Componentpublic class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {  @Autowired  private UserService userService;  @Override  public boolean supportsParameter(MethodParameter parameter) {    return parameter.getParameterType().isAssignableFrom(User.class) && parameter.hasParameterAnnotation(LoginUser.class);  }  @Override  public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,                 NativeWebRequest request, WebDataBinderFactory factory) throws Exception {    //獲取用戶ID    Object object = request.getAttribute(AuthorizationInterceptor.USER_KEY, RequestAttributes.SCOPE_REQUEST);    if(object == null){      return null;    }    //獲取用戶信息    User user = userService.selectById((Long)object);    return user;  }}

WebConfig:

@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {  @Autowired  private AuthorizationInterceptor authorizationInterceptor;  @Autowired  private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;  @Override  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(authorizationInterceptor).addPathPatterns("/**");  }  @Override  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {    argumentResolvers.add(loginUserHandlerMethodArgumentResolver);  }}

Login:

  @PostMapping("/login")  @AuthIgnore  public R login2(@RequestBody User u){    //用戶登錄    long userId =userService.addUser(u);    //生成token    String token = jwtUtils.generateToken(userId);    Map<String, Object> map = new HashMap<>();    map.put("token", token);    map.put("expire", jwtUtils.getExpire());    return R.ok(map);  }

LoginUser注解使用:

@RequestMapping(value="/query2",method= RequestMethod.POST)  public User Query2(@LoginUser User u){     return u;  }

https://gitee.com/renrenio/renren-fast

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久久免费精品 | 久久2019中文字幕 | 国产1区2 | 久久精品超碰 | 特片网久久 | 欧美精品a∨在线观看不卡 午夜精品影院 | av不卡毛片 | 亚洲导航深夜福利涩涩屋 | 欧美18videos性处按摩 | 久久中文字幕在线观看 | 久久精品性视频 | 一区二区三区在线视频观看58 | 黄片毛片一级 | 日本在线国产 | 久久撸视频 | 激情大乳女做爰办公室韩国 | www.91sao| 日韩一级电影在线观看 | 羞羞视频免费视频欧美 | 亚洲成人福利电影 | www.com国产精品 | 久久久av亚洲男天堂 | 最新黄色av | 久久久久久久久久久久久久国产 | 国产一区二区三区视频免费 | 九九热在线免费观看视频 | 成人短视频在线观看 | 成人午夜a| 中文日韩 | 欧美日韩视频在线播放 | 黄色久 | 91精品国产综合久久久欧美 | 久久国产乱子伦精品 | 毛片a级毛片免费播放100 | 亚洲电影在线观看高清免费 | 叉逼视频 | 国产午夜精品久久久久 | 国产精品一区二av18款 | 久久久久久久亚洲精品 | 大号bbwassbigav头交 | 19禁国产精品福利视频 |