修改HttpServletRequest中header中的信息

原创 2018年04月17日 14:55:04

废话一堆:由于业务有统一的鉴权系统,页面请求时在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);
        Object 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(value);
    } 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!

修改request中header的值

在java web开发中,我们有时候会遇到需要修改request中请求值的问题,虽然这个不是特别常见。初看这是一个简单的问题,因为我们能通过HttpServletRequest对象拿到我们需要的所有关...
  • carrie__yang
  • carrie__yang
  • 2017-06-21 12:49:21
  • 2272

HttpServletRequest添加header

做法如下: import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import ...
  • wangjia55
  • wangjia55
  • 2016-06-19 15:42:18
  • 8006

httpServletRequest对象获取请求消息头

RequestDemo3.java 文件:package com.neu;import java.io.IOException; import java.util.Enumeration;import...
  • wangyanming123
  • wangyanming123
  • 2016-08-25 20:44:30
  • 4080

获取HttpServletRequest请求消息头、消息行信息

好记性不如赖笔头………… //获取请求方式 System.out.println(req.getMethod()); //获取项目名称 Syste...
  • ckinghan58
  • ckinghan58
  • 2017-06-22 01:22:37
  • 4886

Servlet客户请求的处理:HTTP请求报头HttpServletRequest接口应用

对请求报头的访问,使Servlet可以执行许多优化,创建高效的Servlet。一,在Servlet 中读取HTTP请求报头 —— HttpServletRequest接口    在Servlet中读取...
  • qfs_v
  • qfs_v
  • 2008-06-18 17:46:00
  • 11996

通过HttpServletRequest获取请求header信息及request.getHeader("referer")的作用

HttpServletRequest获取所有header参数: for (Enumeration enumeration = httpServletRequest.getHeaderNames();...
  • down177
  • down177
  • 2014-12-27 16:25:15
  • 6719

[Servlet]HttpServletRequest的请求参数、标头、编码

1. HttpServletRequest的主要作用:     1) 前面我们已经非常熟悉了,就是在服务器收到请求后创建该对象并将有关请求的所有信息都分解保存在HttpServlet的各个字段中供Se...
  • Lirx_Tech
  • Lirx_Tech
  • 2015-10-26 16:04:30
  • 5057

修改HttpServletRequest的中的参数值

利用SpringMVC上传文件文件,方法A: @RequestMapping(value = "/saveJobInfoFromFile", method = {RequestMethod.POST}...
  • yibei8811
  • yibei8811
  • 2016-03-11 19:06:13
  • 1979

获取HttpServletRequest头文件信息

/** * 获取头文件信息 * * @param request * @return */ public static Map getHeadersInfo(HttpServl...
  • draven1122
  • draven1122
  • 2016-12-02 09:51:17
  • 763

Servlet-request之与请求头相关的方法

/** * @author CSDN_LQR * @TODO request之与请求头相关的方法 */ public class ServletDemo2 extends HttpServlet...
  • CSDN_LQR
  • CSDN_LQR
  • 2016-10-15 14:56:15
  • 688
收藏助手
不良信息举报
您举报文章:修改HttpServletRequest中header中的信息
举报原因:
原因补充:

(最多只允许输入30个字)