亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人免费xxxxx在线观看| 2023亚洲男人天堂| 久久亚洲春色中文字幕| 性金发美女69hd大尺寸| 亚洲国产成人在线视频| 中文字幕在线精品| 国产精品久久久久久久天堂| 黑人巨大精品欧美一区二区一视频| 精品亚洲一区二区三区| 国内精品400部情侣激情| 久久久久亚洲精品| 国产偷亚洲偷欧美偷精品| 国内精品小视频在线观看| 精品国产一区二区三区久久久| 亚洲精品欧美极品| 91地址最新发布| 亚洲经典中文字幕| 国产亚洲人成网站在线观看| 国产精品久久91| 成人亚洲综合色就1024| 日韩成人在线电影网| 日韩欧美在线免费观看| 97视频在线观看免费| 国产男女猛烈无遮挡91| 亚洲成人免费网站| 欧美激情精品久久久久久蜜臀| 欧美xxxx14xxxxx性爽| 黑人与娇小精品av专区| 亚洲国产欧美一区二区三区同亚洲| 亚洲精品国偷自产在线99热| 在线观看日韩www视频免费| 美女av一区二区三区| 黄色精品在线看| 亚洲白拍色综合图区| 亚洲成在人线av| 成人网址在线观看| 国产偷亚洲偷欧美偷精品| 中文字幕免费精品一区| 欧美在线观看视频| 久久99国产综合精品女同| 亚洲福利小视频| 国产网站欧美日韩免费精品在线观看| 久久精品国产亚洲7777| 孩xxxx性bbbb欧美| 国产视频久久久久久久| 国产精品视频导航| 国产精品美女久久| 国产亚洲成av人片在线观看桃| 隔壁老王国产在线精品| 538国产精品一区二区免费视频| 欧美亚洲另类激情另类| 久久久久一本一区二区青青蜜月| 亚洲二区中文字幕| 亚洲精品久久久久久久久久久久| 欧美黑人极品猛少妇色xxxxx| 国产精品久久99久久| 欧美一级淫片aaaaaaa视频| 色小说视频一区| 亚洲高清在线观看| 国产精品久久av| 国模私拍视频一区| 亚洲香蕉伊综合在人在线视看| 北条麻妃一区二区三区中文字幕| 另类视频在线观看| 国产精品视频yy9099| 九九精品视频在线| 欧美一级bbbbb性bbbb喷潮片| 乱亲女秽乱长久久久| 国产精品久久久久91| 欧美激情在线一区| 91精品国产91久久久久久吃药| 欧美有码在线视频| 国产精品国产福利国产秒拍| 亚洲老头老太hd| 欧美精品xxx| 欧美性视频在线| 午夜美女久久久久爽久久| 色香阁99久久精品久久久| 91精品视频网站| 日韩久久午夜影院| 欧美成人小视频| 欧美成人精品三级在线观看| 91精品国产自产在线| 欧美精品电影免费在线观看| 欧美激情一区二区三区高清视频| 日韩专区在线观看| 一区二区三区精品99久久| 亚洲国产美女精品久久久久∴| 亚洲欧美日韩成人| 精品福利免费观看| 色香阁99久久精品久久久| 亚洲欧美日韩一区二区在线| 在线播放亚洲激情| 97人人模人人爽人人喊中文字| 在线播放国产一区中文字幕剧情欧美| 亚洲高清色综合| 91精品视频网站| 色悠悠国产精品| 97超碰色婷婷| 国产欧美日韩中文字幕在线| 国产噜噜噜噜噜久久久久久久久| 国产日韩欧美中文| 欧美日韩国产一区在线| 精品人伦一区二区三区蜜桃免费| 中文字幕日韩欧美精品在线观看| 国产精品美女主播| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美国产日韩二区| 在线视频欧美性高潮| 午夜精品久久久久久久99热浪潮| 国产mv免费观看入口亚洲| 一区二区三区天堂av| 精品久久中文字幕| 欧美电影在线观看| 国产精品99蜜臀久久不卡二区| 久久福利网址导航| 国产91精品最新在线播放| 夜夜嗨av色综合久久久综合网| 欧美色视频日本高清在线观看| 久久这里只有精品99| 日韩精品在线播放| 国产精品99久久久久久www| 亚洲午夜国产成人av电影男同| 亚洲免费成人av电影| 中文字幕国产亚洲| 国产精品自产拍在线观看| 欧美一级免费视频| 91久久久久久久久久| 岛国av一区二区| 久久久999精品视频| 91精品国产91久久久久久不卡| 亚洲欧美国产另类| 日韩电影中文字幕在线| 91九色综合久久| 久久久精品视频成人| 日韩av免费一区| 亚洲免费人成在线视频观看| 国产精品视频大全| 成人国产精品日本在线| 欧美成人中文字幕在线| 国产精品久久久久久久9999| 国产精品久久久久久久午夜| 91在线免费看网站| 亚洲欧美日韩国产精品| 国产成人精彩在线视频九色| 国产精品久久久久久久久久久久久| 中文字幕久热精品在线视频| 成年无码av片在线| 欧美色欧美亚洲高清在线视频| 美女黄色丝袜一区| 98精品国产高清在线xxxx天堂| 亚洲电影免费观看| 久久精品男人天堂| 日韩高清电影免费观看完整版| 国模gogo一区二区大胆私拍| 亚洲视频综合网| 成人国产精品久久久| 亚洲无限乱码一二三四麻| 欧美视频在线免费| 国产精品久久久91| 亚洲香蕉成视频在线观看| 国产视频亚洲视频| 91在线观看免费高清完整版在线观看| 亚洲人成电影网站色xx|