今天遇到一个问题,记录如下
需求: 需要对request的请求添加一个Header,发现没有提供新增/修改Header的方法
进入 HttpServletRequest 的源码查看,由于HttpServletRequest是一个接口,需要找到对应的实现类,才能看有没有对应的接口,进入debug查看httpServletRequest的实现类
测试代码如下:
测试结果如下:
经过测试发现实现类为
org.apache.catalina.connector.RequestFacade
而这只是一个包装类,他的内部还有一个Request对象
进入该类
org.apache.catalina.connector.Request
发现内部仍然有一个对象:
org.apache.coyote.Request
也可以通过上图的debug结果查看
org.apache.coyote.Request提供了addValue方法来修改headers属性.
经过测试可以使用反射来修改header
publicvoidtestServletRequest(HttpServletRequestrequest, HttpServletResponseresponse) throwsIOException, NoSuchFieldException, InstantiationException, IllegalAccessException, ServletException { RequestFacaderequestFacade= (RequestFacade) request; // 反射获取request属性Fieldrequest1=requestFacade.getClass().getDeclaredField("request"); // 设置私有属性权限request1.setAccessible(true); Objecto=request1.get(request); // 获取coyoteRequestFieldcoyoteRequest=o.getClass().getDeclaredField("coyoteRequest"); coyoteRequest.setAccessible(true); Objecto1=coyoteRequest.get(o); Fieldheaders=o1.getClass().getDeclaredField("headers"); headers.setAccessible(true); // 获取HeaderMimeHeaderso2= (MimeHeaders)headers.get(o1); o2.addValue("Auth").setString("123"); request.getRequestDispatcher("/servletRequest/test").forward(request,response); }
参考文章: https://blog.csdn.net/u010698072/article/details/79973830