ZuulFilter的使用场景
生活随笔
收集整理的這篇文章主要介紹了
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的使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 举例说明语言接触会造成哪些结果_语言学概
- 下一篇: 66319d电源使用说明书_电热水壶怎么