最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年12月21日 10:47:10   作者:hongda''s blog  
這篇文章主要介紹了SpringBoot 使用jwt進行身份驗證的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

Code:

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

}

LoginUser:

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

}

JwtUtil:

@ConfigurationProperties(prefix = "jwt")
@Component
public 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=60000
jwt.header=token

攔截器:

/**
 * Created by qhong on 2018/6/7 15:36
 **/
@Component
public 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里,后續(xù)根據(jù)userId,獲取用戶信息
    request.setAttribute(USER_KEY, Long.parseLong(claims.getSubject()));

    return true;
  }
}

注解攔截:

@Component
public 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:

@Configuration
public 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;
  }

http://m.fzitv.net/article/153172.htm
https://gitee.com/renrenio/renren-fast

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

相關文章

  • SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權動態(tài)權限問題

    SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權動態(tài)權限問題

    這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實現(xiàn)鑒權-動態(tài)權限,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Java一致性Hash算法的實現(xiàn)詳解

    Java一致性Hash算法的實現(xiàn)詳解

    這篇文章主要介紹了Java一致性Hash算法的實現(xiàn)詳解,hash的意思是散列,目的將一組輸入的數(shù)據(jù)均勻的分開、打散,往往用來配合路由算法做負載均衡,多用在分布式系統(tǒng)中,需要的朋友可以參考下
    2024-01-01
  • springboot?Long?精度丟失問題解決

    springboot?Long?精度丟失問題解決

    這篇文章主要為大家介紹了解決springboot?Long?精度丟失問題的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java基礎教程之組合(composition)

    Java基礎教程之組合(composition)

    這篇文章主要介紹了Java基礎教程之組合(composition),組合是在Java中實現(xiàn)程序復用(reusibility)的基本手段之一,需要的朋友可以參考下
    2014-08-08
  • java使用tess4j進行圖片文字識別功能

    java使用tess4j進行圖片文字識別功能

    Tess4J?是Java?(JNA)?對?Tesseract?OCR?API?的封裝,Tess4J是java直接可使用的jar包,而Tesseract?OCR是支持Tess4J進文件文字識別的基礎,Tess4J可直接使用Maven方式引入,這篇文章主要介紹了java使用tess4j進行圖片文字識別,需要的朋友可以參考下
    2023-04-04
  • 使用游長編碼對字符串壓縮 Run Length編碼示例

    使用游長編碼對字符串壓縮 Run Length編碼示例

    這篇文章主要介紹了Run Length編碼的一個示例,大家參考使用吧
    2014-01-01
  • Java指令重排引發(fā)問題及解決方案

    Java指令重排引發(fā)問題及解決方案

    指令重排是JVM在解釋執(zhí)行Java代碼時對指令順序進行重新排列的一種優(yōu)化技術,本文主要介紹了Java指令重排引發(fā)問題及解決方案,感興趣的可以了解一下
    2023-08-08
  • Java使用Spring JdbcTemplate向in語句中傳遞參數(shù)的教程詳解

    Java使用Spring JdbcTemplate向in語句中傳遞參數(shù)的教程詳解

    這篇文章主要給大家介紹Java如何使用Spring JdbcTemplate向in語句中傳遞參數(shù),文中有詳細的流程步驟和代碼示例,需要的朋友可以參考下
    2023-07-07
  • Hibernate基于ThreadLocal管理Session過程解析

    Hibernate基于ThreadLocal管理Session過程解析

    這篇文章主要介紹了Hibernate基于ThreadLocal管理Session過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java實戰(zhàn)之飛翔的小鳥小游戲

    Java實戰(zhàn)之飛翔的小鳥小游戲

    這篇文章主要介紹了Java實戰(zhàn)之飛翔的小鳥小游戲,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

平顶山市| 和林格尔县| 大方县| 太原市| 宁强县| 金溪县| 闵行区| 尼玛县| 察隅县| 高阳县| 阿巴嘎旗| 深圳市| 五峰| 邳州市| 平凉市| 镇远县| 彭阳县| 林州市| 珠海市| 瓮安县| 桑日县| 莱西市| 南澳县| 淄博市| 瑞金市| 洞口县| 阿鲁科尔沁旗| 安顺市| 连江县| 凤城市| 绥宁县| 洪洞县| 肃北| 海丰县| 政和县| 托克托县| 托克托县| 大埔县| 榆树市| 商丘市| 宜城市|