如何修改HttpServletRequest中header中的信息

网友投稿 1499 2022-10-31

如何修改HttpServletRequest中header中的信息

如何修改HttpServletRequest中header中的信息

目录总结一句话往下看具体实现方式说明:可以看到在方法中解释具体过程如下

废话一堆:

由于业务有统一的鉴权系统,页面请求时在header中带过来gsid,正常业务没有问题,但是当需要-文件时,前端统一用json解析响应,当响应文件时,对于前端来说不好处理,就决定使用简单的get请求-文件,将gsid通过url带过来,这样的话后端鉴权就需要处理,当header中没有gsid时,从参数中取,为了尽可能少的改变公用的业务代码(指sso),就在当前项目中自定义权限-。

总结一句话

我就是想想header中加东西!!

往下看具体实现方式

新建-类,继承原有的-,重写其preHandle方法

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {

String gsid = request.getHeader("GSID");

if(StringUtils.isBlank(gsid)){

String gsid= request.getParameter("GSID");

//使用反射,将gsid设置到request中的的header中去

reflectSetparam(request,"GSID",gsid);

log.info("请求连接中的gsid={}",request.getHeader("GSID"));

}

return super.preHandle(request, response, o);

}

说明:可以看到在方法中

1、先进行header信息判断,如果header中没有GSID,就去请求参数中拿

gsid= request.getParameter("GSID");

2、通过反射将参数中的GSID键值对儿:“GSID”:“376645354562335”加入到header中去

话不多少,先上代码,再解释:

解释

/**

* 修改header信息,key-value键值对儿加入到header中

* @param request

* @param key

* @param value

*/

private void reflectSetparam(HttpServletRequest request,String key,String value){

Class extends HttpServletRequest> requestClass = request.getClass();

System.out.println("request实现类="+requestClass.getName());

try {

Field request1 = requestClass.getDeclaredField("request");

request1.setAccessible(true);

Object o = request1.get(request);

Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");

coyoteRequest.setAccessible(true);

Objecthttp:// o1 = coyoteRequest.get(o);

System.out.println("coyoteRequest实现类="+o1.getClass().getName());

Field headers = o1.getClass().getDeclaredField("headers");

headers.setAccessible(true);

MimeHeaders o2 = (MimeHeaders)headers.get(o1);

o2.addValue(key).setString(vahttp://lue);

} catch (Exception e) {

e.printStackTrace();

}

}

执行打印信息如下:

request实现类=org.apache.catalina.connector.RequestFacade    coyoteRequest实现类=org.apache.coyote.Request

看HttpServletRequest的源码,是个接口,并且我们获取header信息的方法是getHeader()方法,按常理其对象中应该有header字段,那么我们就去实现类中找这个字段

具体过程如下

步骤一:先找到具体的Request对象是哪个类,根据打印信息看源码

进入其中找到getHeader()方法,如下

public String getHeader(String name) {

if (this.request == null) {

throw new IllegalStateException(sm.getString("requestFacade.nullRequest"));

} else {

return this.request.getHeader(name);

}

}

然后我们找this.request

这个request,我们找到它的类型,点击去

这个类的全路径是:org.apache.catalina.connector.Request

这个类中找getHeader方法

public String getHeader(String name) {

return this.coyoteRequest.getHeader(name);

}

找到这个类中的coyoteRequest

protected org.apache.coyote.Request coyoteRequest;

是这样的

再找到getHeader()

public String getHeader(String name) {

return this.headers.getHeader(name);

}

好了,终于见到属性了

private final MimeHeaders headers = new MimeHeaders();

找到MineHeaders中的getHeader方法,

public String getHeader(String name) {

MessageBytes mh = this.getValue(name);

return mh != null ? mh.toString() : null;

}

看到最终header是一个MessageBytes对象,好找到这个对象进去,发现只能setValue,那就在MineHeaders中找在哪里实例化MessageBytes对象的

找了半天找到在createHeader()方法中实例化MimeHeaderField对象,然后这个对象实例化时会实例化MessageBytes对象

这里有name,value,靠谱

然后再在MimeHeader中找在addValue方法中有调用,就用这个试一下吧,然后就是最上面的我自定义的方法,在heade中加入了一个键值对儿。

测试请求:

http://127.0.0.1:32100/v1/CustomerRefundRest/exportRefund?gsid=abc114f1bd0d484084e5df3fe1c419b8&refundLongStartDate=1520611199000&refundLongEndDate=1522943999000

测试打印结果:

OVER!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于vue扩展的服务器渲染框架ream.js开发的demo
下一篇:如何使用RequestHeaders添加自定义参数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~