亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Zuul 如何在pre Filter內為request setAttribute

Zuul 如何在pre Filter內為request setAttribute

哆啦的時光機 2019-01-19 21:03:46
我希望能在zuul的filter對request進行setAttribute("key",value)操作,然后在下游的服務能夠通過request.getAttribute("key")的方式獲取到數據;但結果未如預期發生,在filter內為request添加了attribute并未被傳遞到下游服務中; /** * Created by zhaoyuening on 2018/1/26. */ @Component public class TokenCheckFilter extends ZuulFilter { private final String JWT_HEADER_NAME = "token"; private final Logger logger = LoggerFactory.getLogger(TokenCheckFilter.class); @Value("${token.filter}") private boolean IS_FILTER; @Autowired private RoleResourceManager roleResourceManager; @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 5; } @Override public boolean shouldFilter() { if (IS_FILTER){ logger.info("開啟token過濾"); }else{ logger.info("未開啟token過濾"); } return IS_FILTER; } //超級管理員角色 @Value("${root.role}") private String ROOT_ROLE; @Override //TODO 目前每次修改鑒權權限等信息 需要重啟 //后續版本修改后采用mq 自動更新緩存 public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); String url = request.getRequestURI(); String method = request.getMethod(); //檢測資源狀態 是否為白名單 或 被禁用 // 0 白名單 1 被監控權限 2 禁用 Integer resourceStatus = roleResourceManager.checkStatusForResource(method, url); if (resourceStatus == null || resourceStatus == -1||resourceStatus == 2){ createResponce("request fail!",ctx); return null; } else if (resourceStatus == 0){ //白名單 放行 return null; } //使用jwtBean解碼裝載jwt信息 CodecUtils.JwtBean jwtBean = CodecUtils.JwtBean.getJwtBean(request.getHeader(JWT_HEADER_NAME)); //將信息存儲到request addRequestAttribute(jwtBean,request); if (jwtBean != null){ //jwt 用戶角色信息 List<String> roleIdList = (List<String>) jwtBean.getPlayload(JwtFieldEnum.ROLES.getField()); //指定id為1 的角色為超級管理員 if (roleIdList != null && roleIdList.contains(ROOT_ROLE)){ return null; } if (roleIdList != null && roleResourceManager.checkAuthority(method, url, roleIdList)) { //該檢驗通過 該用戶具備訪問資源的權限 return null; } } //游客身份 //查看是否為白名單Resource createResponce("request fail",ctx); return null; } /** * 請求失敗 調用 * @param msg * @param ctx */ private void createResponce(String msg,RequestContext ctx){ // 過濾該請求,不對其進行路由 ctx.setSendZuulResponse(false); // 返回無權限錯誤碼 ctx.setResponseStatusCode(50008); // 返回錯誤內容 ctx.setResponseBody(msg); ctx.set("isSuccess", false); } /** * 從jwtBean獲取相應信息,并加裝到request內 * @param jwtBean * @param request */ private void addRequestAttribute(CodecUtils.JwtBean jwtBean,HttpServletRequest request) { if (jwtBean == null) { return; } //roles Object roles = jwtBean.getPlayload(JwtFieldEnum.ROLES.getField()); Object username = jwtBean.getPlayload(JwtFieldEnum.USERNAME.getField()); Object admin = jwtBean.getPlayload(JwtFieldEnum.ADMIN.getField()); //save info to request request.setAttribute(RequestAttributeKeyEnum.ACCOUNT_ROLES.getKey(),roles); request.setAttribute(RequestAttributeKeyEnum.ACCOUNT_USERNAME.getKey(),username); request.setAttribute(RequestAttributeKeyEnum.ACCOUNT_ADMIN.getKey(),admin); RequestContext.getCurrentContext().setRequest(request); } } 這是我的自定義pre filter 對request進行操作發生在最后的addRequestAttribute方法內,應該如何操作讓下游接收到我在filter內對request添加的數據;
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

RequestContext#addZuulRequestHeader,傳遞的內容,放在頭部。這樣下游應用,可以從頭部獲取。

查看完整回答
反對 回復 2019-02-12
?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

問題解決了 setAttribute 只是以request對象為載體在單個程序內傳輸的數據,并在http規范中,不會被轉發到其他地方。只能采用requestHeader的方式來傳輸

查看完整回答
反對 回復 2019-02-12
  • 2 回答
  • 0 關注
  • 976 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號