1.増やし依存JWT
<依存性> <のgroupId> com.auth0 </のgroupId> <たartifactId>のJava JWT </たartifactId> <バージョン> 3.8.1 </バージョン> </依存>
2.JWTツール
パブリック クラスTokenUtil { // トークン鍵 プライベート 静的な 最終文字列TOKEN_SECRET = "27f56a1ca0a347618ff39c7fdf9ab684" ; // 15分のタイムアウト時間 プライベート 静的 最終 長い Out_timeを* = 1000 60 * 150 ; プライベート 静的ロガーLoggerFactory.getLogger =ログ(。TokenUtilのクラス) ; / * 暗号化 * @param のuserId * @return * / パブリック 静的{文字列の記号(文字列のuserId)を してみてください { 日EXPIRATION_TIME= 新しい日付(のSystem.currentTimeMillis()+ Out_timeまで)。 アルゴリズムアルゴリズム = Algorithm.HMAC256(TOKEN_SECRET)。 地図 headerMap = <文字列は、オブジェクト> 新しい HashMapを<>(2 ); headerMap.put( "タイプ"、 "JWT" )。 headerMap.put( "ALG"、 "HS256" )。 返す。JWT.create()withHeader(headerMap).withClaim( "はuserId" 、USERID).withExpiresAt(EXPIRATION_TIME).sign(アルゴリズム)。 } キャッチ(例外e){ log.error(e.getMessage())。 リターン 。ヌル } } / ** 解密 * @paramのトークン * @return * / パブリック 静的地図の<string、請求項> verifyToken(文字列トークン){ DecodedJWT decodedJWT = NULL ; 試す{ JWTVerifier検証 = JWT.require(Algorithm.HMAC256(TOKEN_SECRET))(ビルド)。 decodedJWT = verifier.verify(トークン)。 log.info( "超时时间:" + decodedJWT.getExpiresAt()); log.info( "载体信息:" + decodedJWT.getClaim( "userIdを").asString())。 log.info( "アルゴリズム:" + decodedJWT.getAlgorithm()); } キャッチ(例外E){ // デコード例外がスローされ log.error(e.getMessage()); リターン NULL ; } 戻りdecodedJWT.getClaims(); } }
前記インターセプタは、要求をインターセプトし、springboot注入インターセプタ
@Component パブリック クラス TokenInterceptorが実装HandlerInterceptor { プライベート ロガーロガー= LoggerFactory.getLogger(TokenInterceptor クラス)。 @Override パブリック ブール preHandleは(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクト・ハンドラ)スロー例外{ 文字列トークン = request.getHeader( "トークン" )。 // トークン验证 場合(!StringEmpty.IsEmpty(トークン)){ 地図 <文字列、請求> claimMap = TokenUtil.verifyToken(トークン)。 もし claimMap(!=ヌル){ // アカウントの操作... 返す trueに; } 他{ // 検証エラーは、エラーページにジャンプ Response.sendRedirect(request.getContextPath()+ "/ twjd /エラー" ); を返す falseに; } } リターン falseに; } }
@Configuration パブリック クラス InterceptorConfigは 実装WebMvcConfigurer { @Autowired プライベートTokenInterceptor tokenInterceptorを。 @Override 公共 ボイドaddInterceptors(InterceptorRegistryレジストリ){ InterceptorRegistration登録 = registry.addInterceptor(tokenInterceptor)。 // 拦截配置 registration.addPathPatterns( "/ twjd / **" ); // 排除配置 registration.excludePathPatterns( "/ twjd /ログイン"、 "/ twjd /エラー" ); } }
4.ユーザーログイン操作は、認証トークンを運ぶためにならば、ユーザは、トークン運ぶことを確認してください
/ ** *用户登陆 * * @param用のsysusers * @paramのリクエスト * @paramの応答 * @return * / @RequestMapping(値 = "/ログイン"、メソッド= RequestMethod.POST) @ResponseBody 公共のHashMap <文字列、文字列> ログイン(SYSUSERのsysusers、HttpServletRequestのリクエスト、HttpServletResponseの応答){ SYSUSERユーザー = logService.getUser(sysusers.getName())。 HashMapの tokenMap = <文字列、文字列> 新規のHashMap <>(1 )。 //ユーザーおよび発行されたパスワードに保存されているが正しいトークンである IF(ヌル!=ユーザー&& user.getPassword()。等号(sysusers.getPassword())){ IF(!StringEmpty.IsEmpty(user.getPassword())){ response.setHeader ( "トークン" 、TokenUtil.sign(user.getID())); tokenMap.put( "トークン" 、TokenUtil.sign(user.getID())); // 一日の有効期限のRedisに設定記憶されている IF( !redisUtil.exists(sysusers.getName())){ logger.info( "アクティブユーザ+1しました:" + sysusers.getName()); redisUtil.set(sysusers.getName()、のsysusers、1、TimeUnit.DAYS) ; } 戻りtokenMapを; } } 他{ tokenMap.put( "トークン"、 "ユーザ不在" ); } 戻り、tokenMapを }