为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 989 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号