SpringSecurity再过滤器中通过反射修改请求头

问题背景:

我想通过反射修改请求的头,但是试了很多次,一致无法完成。
代码:

@Component
public class HeaderControlFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("sss");
        filterChain.doFilter(request, response);
    }
}

在上述代码的输出语句打上断点后,找到Headers的位置如下:

img

于是我就自己开始尝试着写:

 Class<? extends HttpServletRequest>itsClass=request.getClass();
        try{
            Field request1 = itsClass.getSuperclass().getSuperclass().getDeclaredField("request");
            request1.setAccessible(true);
            Object o = request1.get(request);

            Field o2 = o.getClass().getSuperclass().getSuperclass().getDeclaredField("request");
            o2.setAccessible(true);
            Object oo = o2.get(request);

            Field o3 = oo.getClass().getSuperclass().getSuperclass().getDeclaredField("request");
            o3.setAccessible(true);
            Object ooo=o3.get(request);

            Field o4 = ooo.getClass().getSuperclass().getSuperclass().getDeclaredField("request");
            o4.setAccessible(true);
            Object oooo=o4.get(request);
            System.out.println("ss");
      }

结果发现我一直在兜圈子:

img

img


想请教下各位。当然,也乐意倾听其他实现方式。

你如果只是想getHeader的时候,返回你需要的数据,那也没必要搞反射去改数据,拦截链中的传递的request,又不绝对是原始的request,你在外面包一层request,自己改写getheader的逻辑

img


img


-------------------------------- 运行效果

img


img