如何修改HttpServletRequest中header中的信息
廢話一堆:
由于業(yè)務有統(tǒng)一的鑒權系統(tǒng),頁面請求時在header中帶過來gsid,正常業(yè)務沒有問題,但是當需要下載文件時,前端統(tǒng)一用json解析響應,當響應文件時,對于前端來說不好處理,就決定使用簡單的get請求下載文件,將gsid通過url帶過來,這樣的話后端鑒權就需要處理,當header中沒有gsid時,從參數中取,為了盡可能少的改變公用的業(yè)務代碼(指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();
}
}
執(zhí)行打印信息如下:
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對象,好找到這個對象進去,發(fā)現只能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!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)
這篇文章主要介紹了Jdk8中Stream流的使用,讓你脫離for循環(huán),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02
一文詳細解析Java?8?Stream?API中的flatMap方法
這篇文章主要介紹了Java?8?Stream?API中的flatMap方法的相關資料,flatMap方法是Java?StreamAPI中的重要中間操作,用于將流中的每個元素轉換為一個新的流,并將多個流合并為一個單一的流,常用于處理嵌套集合和一對多映射,需要的朋友可以參考下2024-12-12
一篇超詳細的SpringBoot整合MybatisPlus的文章
這篇文章主要介紹了springboot整合Mybatis-plus的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-07-07
Java 并發(fā)編程之ThreadLocal詳解及實例
這篇文章主要介紹了Java 并發(fā)編程之ThreadLocal詳解及實例的相關資料,需要的朋友可以參考下2017-02-02

