2020
2121< script class ="next-config " data-name ="main " type ="application/json "> { "hostname" :"simuleite.github.io" , "root" :"/" , "images" :"/images" , "scheme" :"Muse" , "darkmode" :false , "version" :"8.21.0" , "exturl" :false , "sidebar" :{ "position" :"left" , "width_expanded" :320 , "width_dual_column" :240 , "display" :"post" , "padding" :18 , "offset" :12 } , "hljswrap" :true , "copycode" :{ "enable" :false , "style" :null } , "fold" :{ "enable" :false , "height" :500 } , "bookmark" :{ "enable" :false , "color" :"#222" , "save" :"auto" } , "mediumzoom" :false , "lazyload" :false , "pangu" :false , "comments" :{ "style" :"tabs" , "active" :null , "storage" :true , "lazyload" :false , "nav" :null } , "stickytabs" :false , "motion" :{ "enable" :true , "async" :false , "transition" :{ "menu_item" :"fadeInDown" , "post_block" :"fadeIn" , "post_header" :"fadeInDown" , "post_body" :"fadeInDown" , "coll_header" :"fadeInLeft" , "sidebar" :"fadeInUp" } } , "i18n" :{ "placeholder" :"搜索..." , "empty" :"没有找到任何搜索结果:${query}" , "hits_time" :"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)" , "hits" :"找到 ${hits} 个搜索结果" } , "path" :"/search.xml" , "localsearch" :{ "enable" :true , "top_n_per_article" :1 , "unescape" :false , "preload" :false } } </ script > < script src ="/js/config.js "> </ script >
2222
23- < meta name ="description " content ="参考资料 柏码知识库 1.0 Session 有状态:用户请求接口 -> 从Session中读取用户信息 -> 根据当前的用户来处理业务 -> 返回 缺点:不支持分布式 2.0 Token 无状态:用户携带Token请求接口 -> 从请求中获取用户信息 -> 根据当前的用户来处理业务 -> 返回 <dependency> <g ">
23+ < meta name ="description " content ="1.0 Session 有状态:用户请求接口 -> 从Session中读取用户信息 -> 根据当前的用户来处理业务 -> 返回 缺点:不支持分布式 2.0 Token 无状态:用户携带Token请求接口 -> 从请求中获取用户信息 -> 根据当前的用户来处理业务 -> 返回 <dependency> <groupId>com. ">
2424< meta property ="og:type " content ="article ">
2525< meta property ="og:title " content ="前后端分离 ">
2626< meta property ="og:url " content ="http://simuleite.github.io/ComputerScience/%E7%AC%94%E8%AE%B0/%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB/index.html ">
2727< meta property ="og:site_name " content ="SMULET's BLOG ">
28- < meta property ="og:description " content ="参考资料 柏码知识库 1.0 Session 有状态:用户请求接口 -> 从Session中读取用户信息 -> 根据当前的用户来处理业务 -> 返回 缺点:不支持分布式 2.0 Token 无状态:用户携带Token请求接口 -> 从请求中获取用户信息 -> 根据当前的用户来处理业务 -> 返回 <dependency> <g ">
28+ < meta property ="og:description " content ="1.0 Session 有状态:用户请求接口 -> 从Session中读取用户信息 -> 根据当前的用户来处理业务 -> 返回 缺点:不支持分布式 2.0 Token 无状态:用户携带Token请求接口 -> 从请求中获取用户信息 -> 根据当前的用户来处理业务 -> 返回 <dependency> <groupId>com. ">
2929< meta property ="og:locale " content ="zh_CN ">
3030< meta property ="article:published_time " content ="2024-12-26T16:00:00.000Z ">
31- < meta property ="article:modified_time " content ="2024-12-29T03:19 :27.825Z ">
31+ < meta property ="article:modified_time " content ="2024-12-29T06:53 :27.039Z ">
3232< meta property ="article:author " content ="SIMULEITE ">
3333< meta property ="article:tag " content ="笔记 ">
3434< meta name ="twitter:card " content ="summary ">
138138 < div class ="sidebar-panel-container ">
139139 <!--noindex-->
140140 < div class ="post-toc-wrap sidebar-panel ">
141- < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99 " > < span class =" nav-text " > 参考资料 </ span > </ a > </ li > < li class =" nav-item nav-level-1 " > < a class =" nav-link " href =" # 10-session "> < span class ="nav-text "> 1.0 Session</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#20-token "> < span class ="nav-text "> 2.0 Token</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#jwt%E9%80%80%E5%87%BA%E7%99%BB%E5%BD%95 "> < span class ="nav-text "> JWT退出登录</ span > </ a > </ li > </ ol > </ li > </ ol > </ div >
141+ < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#10-session "> < span class ="nav-text "> 1.0 Session</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#20-token "> < span class ="nav-text "> 2.0 Token</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#jwt%E9%80%80%E5%87%BA%E7%99%BB%E5%BD%95 "> < span class ="nav-text "> JWT退出登录</ span > </ a > </ li > </ ol > </ li > </ ol > </ div >
142142 </ div >
143143 <!--/noindex-->
144144
@@ -231,7 +231,7 @@ <h1 class="post-title" itemprop="name headline">
231231 < i class ="far fa-calendar-check "> </ i >
232232 </ span >
233233 < span class ="post-meta-item-text "> 更新于</ span >
234- < time title ="修改时间:2024-12-29 11:19 :27 " itemprop ="dateModified " datetime ="2024-12-29T11:19 :27+08:00 "> 2024-12-29</ time >
234+ < time title ="修改时间:2024-12-29 14:53 :27 " itemprop ="dateModified " datetime ="2024-12-29T14:53 :27+08:00 "> 2024-12-29</ time >
235235 </ span >
236236
237237
@@ -243,11 +243,7 @@ <h1 class="post-title" itemprop="name headline">
243243
244244
245245
246- < div class ="post-body " itemprop ="articleBody "> < h1 id ="参考资料 "> < a class ="markdownIt-Anchor " href ="#参考资料 "> </ a > 参考资料</ h1 >
247- < ol >
248- < li > < a target ="_blank " rel ="noopener " href ="https://www.itbaima.cn/document/wci9lb9tgea866jt?segment=1#doc1-%E8%B5%B0%E8%BF%9BSpringBoot%E5%89%8D%E5%90%8E%E7%AB%AF%E5%88%86%E7%A6%BB "> 柏码知识库</ a > </ li >
249- </ ol >
250- < h1 id ="10-session "> < a class ="markdownIt-Anchor " href ="#10-session "> </ a > 1.0 Session</ h1 >
246+ < div class ="post-body " itemprop ="articleBody "> < h1 id ="10-session "> < a class ="markdownIt-Anchor " href ="#10-session "> </ a > 1.0 Session</ h1 >
251247< p > 有状态:用户请求接口 -> < strong > 从Session中读取用户信息</ strong > -> 根据当前的用户来处理业务 -> 返回</ p >
252248< p > 缺点:< strong > 不支持分布式</ strong > </ p >
253249< h1 id ="20-token "> < a class ="markdownIt-Anchor " href ="#20-token "> </ a > 2.0 Token</ h1 >
@@ -269,6 +265,7 @@ <h2 id="jwt退出登录"><a class="markdownIt-Anchor" href="#jwt退出登录"></
269265< p > 采用黑名单方案。一台服务器存储JWT黑名单,共享给所有微服务。</ p >
270266< figure class ="highlight java "> < table > < tr > < td class ="code "> < pre > < span class ="line "> JWT.create()</ span > < br > < span class ="line "> < span class ="comment "> // 额外添加一个UUID用于记录黑名单,将其作为JWT的ID属性jti</ span > </ span > < br > < span class ="line "> .withJWTId(UUID.randomUUID().toString())</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
271267< figure class ="highlight java "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="keyword "> public</ span > < span class ="keyword "> class</ span > < span class ="title class_ "> JwtUtils</ span > { </ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="keyword "> private</ span > < span class ="keyword "> static</ span > < span class ="keyword "> final</ span > HashSet<String> blackList = < span class ="keyword "> new</ span > < span class ="title class_ "> HashSet</ span > <>();</ span > < br > < span class ="line "> < span class ="comment "> // 加入黑名单方法</ span > </ span > < br > < span class ="line "> < span class ="keyword "> public</ span > < span class ="keyword "> static</ span > < span class ="type "> boolean</ span > < span class ="title function_ "> invalidate</ span > < span class ="params "> (String token)</ span > {</ span > < br > < span class ="line "> < span class ="type "> Algorithm</ span > < span class ="variable "> algorithm</ span > < span class ="operator "> =</ span > Algorithm.HMAC256(key);</ span > < br > < span class ="line "> < span class ="type "> JWTVerifier</ span > < span class ="variable "> jwtVerifier</ span > < span class ="operator "> =</ span > JWT.require(algorithm).build();</ span > < br > < span class ="line "> < span class ="keyword "> try</ span > {</ span > < br > < span class ="line "> < span class ="type "> DecodedJWT</ span > < span class ="variable "> verify</ span > < span class ="operator "> =</ span > jwtVerifier.verify(token);</ span > < br > < span class ="line "> Map<String, Claim> claims = verify.getClaims();</ span > < br > < span class ="line "> < span class ="comment "> //取出UUID丢进黑名单中</ span > </ span > < br > < span class ="line "> < span class ="keyword "> return</ span > blackList.add(verify.getId());</ span > < br > < span class ="line "> } < span class ="keyword "> catch</ span > (JWTVerificationException e) {</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > < span class ="literal "> false</ span > ;</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> < span class ="keyword "> public</ span > < span class ="keyword "> static</ span > UserDetails < span class ="title function_ "> resolveJwt</ span > < span class ="params "> (String token)</ span > {</ span > < br > < span class ="line "> < span class ="type "> Algorithm</ span > < span class ="variable "> algorithm</ span > < span class ="operator "> =</ span > Algorithm.HMAC256(key);</ span > < br > < span class ="line "> < span class ="type "> JWTVerifier</ span > < span class ="variable "> jwtVerifier</ span > < span class ="operator "> =</ span > JWT.require(algorithm).build();</ span > < br > < span class ="line "> < span class ="keyword "> try</ span > {</ span > < br > < span class ="line "> < span class ="type "> DecodedJWT</ span > < span class ="variable "> verify</ span > < span class ="operator "> =</ span > jwtVerifier.verify(token);</ span > < br > < span class ="line "> < span class ="comment "> // 判断是否存在于黑名单中,如果存在,则返回null表示失效</ span > </ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (blackList.contains(verify.getId()))</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > < span class ="literal "> null</ span > ;</ span > < br > < span class ="line "> Map<String, Claim> claims = verify.getClaims();</ span > < br > < span class ="line "> < span class ="keyword "> if</ span > (< span class ="keyword "> new</ span > < span class ="title class_ "> Date</ span > ().after(claims.get(< span class ="string "> "exp"</ span > ).asDate()))</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > < span class ="literal "> null</ span > ;</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > User</ span > < br > < span class ="line "> .withUsername(claims.get(< span class ="string "> "name"</ span > ).asString())</ span > < br > < span class ="line "> .password(< span class ="string "> ""</ span > )</ span > < br > < span class ="line "> .authorities(claims.get(< span class ="string "> "authorities"</ span > ).asArray(String.class))</ span > < br > < span class ="line "> .build();</ span > < br > < span class ="line "> } < span class ="keyword "> catch</ span > (JWTVerificationException e) {</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > < span class ="literal "> null</ span > ;</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> </ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
268+
272269 </ div >
273270
274271
0 commit comments