spring拦截器自定义header头信息,读取不到数据????

登录信息是使用jwt保存的,所以我想在拦截器把jwt用户信息解析出来,然后放在header头中,以便后续业务需要用户信息直接可以读取header头信息。但是我设置了header读取不到数据,怎么回事???

  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        //统一拦截
        logger.info("============拦截请求.........==============");
        String headerToken = request.getHeader(CoreCommonConstant.H_TOKEN_KEY);
        String paramToken = request.getParameter(CoreCommonConstant.H_TOKEN_KEY);
        if (StringUtils.isAllBlank(headerToken, paramToken)) {
         throw new BizException(GlobalResponseResultEnum.LOSE_AUTH_TOKEN_ERROR.getCode(),GlobalResponseResultEnum.LOSE_AUTH_TOKEN_ERROR.getMessage());
        }
        String token = StringUtils.isBlank(headerToken) ? paramToken : headerToken;
        Claims claims;
        try{
            claims = CsJwtUtil.parseJwt(token);
        }catch (CheckJwtException e){
            throw new BizException(e.getCode(),e.getMessage());
        }
        claims.put("tokenExpire",claims.get("exp"));
        request.setAttribute("TEST",1111);// 测试
//        request.setAttribute(CoreCommonConstant.USER_INFO,URLEncoder.encode(JSON.toJSONString(claims), "UTF-8"));
        System.out.println(request.getHeader("TEST"));//读取数据为 null
        return true;
    }
阅读 7.3k
3 个回答

setAttribute("TEST",1111) 并不是放到 Header 头部。
获取应该是:request.getAttribute("TEST")

新手上路,请多包涵

你要模拟法请求,请求头中携带KEY 为TEST的参数, 不是说setAttribute("TEST",1111)那肯定是拿不到Header key为TEST的信息,因为Header里面根本没有

request的attribute和header就不是一个东西,这样当然取不到。request里的header是没法直接往里面添加值的,真要这么做就得修改HttpServletRequestWrapper类。不过你真的打算这样做吗?
你的目的是在拦截器里设置用户信息,以便后续业务代码能取到,这样的话request.setAttribute("TEST",1111)是没错的,只是取的时候不是getHeader方法而是getAttribute方法。或者更简单一点用ThreadLoacal,这样你也不用往每个业务层方法传一个request进去了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题