日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ZuulFilter的使用场景

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ZuulFilter的使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

各個微服務的訪問需要網關統一管理進行跳轉,而在訪問網關時,我們可以進行增強功能,通過過慮器實現請求過慮,身份校驗

等。

/*** 身份校驗過濾器*/ @Component public class LoginFilter extends ZuulFilter {@AutowiredAuthService authService;/*** 過濾器類型 4種* pre:請求在被路由之前* 執行routing:在路由請求時調用* post:在routing和errror過濾器之后調用* error:處理請求時發生錯誤調用* @return*/@Overridepublic String filterType() {//return null 會導致 FilterProcessor - null異常return "pre";}/*** 過濾器序號* 越小越優先被執行* @return*/@Overridepublic int filterOrder() {return 0;}//是否執行過濾器@Overridepublic boolean shouldFilter() {//返回true表示執行此過濾器return true;}//過濾器得內容//過慮所有請求,判斷頭部信息是否有Authorization,如果沒有則拒絕訪問,否則轉發到微服務。@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();//得到requestHttpServletRequest request = requestContext.getRequest();HttpServletResponse response = requestContext.getResponse();//cookieString tokenFormCookie = authService.getTokenFormCookie();if(StringUtils.isEmpty(tokenFormCookie)){access_denied();return null;}//hearString tokenFormHeader = authService.getTokenFormHeader(request);if(StringUtils.isEmpty(tokenFormHeader)){access_denied();return null;}//redislong expireFormRedis = authService.getExpireFormRedis(tokenFormCookie);if(expireFormRedis<0){access_denied();return null;}return null;}//拒絕訪問private void access_denied(){RequestContext requestContext = RequestContext.getCurrentContext();//得到requestHttpServletRequest request = requestContext.getRequest();HttpServletResponse response = requestContext.getResponse();//拒絕訪問requestContext.setSendZuulResponse(false);//回復響應requestContext.setResponseStatusCode(200);ResponseResult responseResult = new ResponseResult(CommonCode.UNAUTHENTICATED);String s = JSON.toJSONString(responseResult);requestContext.setResponseBody(s);response.setContentType("application/json;charset=utf-8");}}

@service

@Service public class AuthService {@AutowiredStringRedisTemplate stringRedisTemplate;//從cookie中獲取jwt令牌public String getTokenFormCookie() {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();Map<String, String> map = CookieUtil.readCookie(request, "uid");if(map!=null&&map.get("uid")!=null){return map.get("uid");}return null;}//從請求頭中獲取jwt令牌public String getTokenFormHeader(HttpServletRequest request) {String authorization = request.getHeader("Authorization");if(StringUtils.isEmpty(authorization)){return null;}if(!authorization.startsWith("Bearer ")){return null;}String jwt = authorization.substring(7);return jwt;}//從redis獲取過期時間public long getExpireFormRedis(String access_token){String key ="user_token:" + access_token;Long expire = stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);return expire;} }

可以從代碼中看到,我們LoginFilter繼承ZuulFilter后實現4個子方法,分別是1.過濾器的類型(處理時機), 2.此過濾器的優先級 3.是否執行此過濾器 4.過濾器的內容。??

我們實現了一個在請求被路由之前的身份驗證功能,在4中獲取request中的

1.判斷request中的cookie是否有jwt身份短令牌,沒有則拒絕訪問

2.判斷request的Header中是否有jwt令牌,沒有則拒絕訪問

3.判斷redis中此令牌是否過期,過期則拒絕訪問

最后,都滿足則路由跳轉至指定微服務,不滿足則response返回未登錄授權異常

總結

以上是生活随笔為你收集整理的ZuulFilter的使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。