java 修改HttpServletRequest的參數(shù)或請求頭

場景:過濾器中獲取參數(shù)Token并添加到請求頭(用戶認(rèn)證兼容老系統(tǒng))
請求頭和請求參數(shù)是不能直接修改卷仑,也沒有提供修改的方法芦疏,但是可以在過濾器和攔截器中使用HttpServletRequestWrapper包裝類達(dá)到修改的目的外永。

一躯泰、實現(xiàn)HttpServletRequestWrapper接口进肯,下面直接使用匿名類
package com.xxxx.web.filter;

import org.apache.commons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.Enumeration;

@WebFilter
public class AuthHeaderSettingFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request) {
            /**
             * 當(dāng)調(diào)用request.getHeader("token")時牡彻,則獲取請求參數(shù)中token值并當(dāng)做Header的值返回
             * @param name
             * @return
             */
            @Override
            public String getHeader(String name) {
                // 先從原本的Request中獲取頭估灿,如果為空且名字為token崇呵,則從參數(shù)中查找并返回
                String superHeader = super.getHeader(name);
                if("token".equals(name) && StringUtils.isEmpty(superHeader)){
                    String token = request.getParameter("token");
                    if (StringUtils.isNotEmpty(token)) {
                        return token ;
                    }
                }
                return superHeader;
            }
        };
        chain.doFilter(requestWrapper,response);
    }

    @Override
    public void destroy() {
    }
}
二、HttpServletRequestWrapper馅袁、ServletRequestWrapperHttpServletRequest接口中的很多方法都可以重寫
  1. 要想增加一個請求參數(shù)可以在HttpServletRequestWrapper中重寫getParameter(String name)
    @Override
    public String getParameter(String name) {
        if("newParam".equals(name)){
            return "這是我新增加的參數(shù)";
        }
        return super.getParameter(name);
    }
    @Override
    public Map<String, String[]> getParameterMap() {
        HashMap<String, String[]> newMap = new HashMap<>();
        newMap.putAll(super.getParameterMap());
        newMap.put("newParam",new String[]{"這是我新增加的參數(shù)"}) ;
        return Collections.unmodifiableMap(newMap);
    }
    @Override
    public String[] getParameterValues(String name) {
        if("newParam".equals(name)){
            return new String[]{"這是我新增加的參數(shù)"};
        }
        return super.getParameterValues(name);
    }

注意: getParameterMap()返回的時一個不可修改的map ,不能直接向里面put值演熟, 所以在重寫這個方法時要自己new 一個HashMap ,然后在新建的map中放值,最后返回時必須調(diào)用Collections.unmodifiableMap(Map<? extends K, ? extends V> m) 把map改成不可變的

  1. 結(jié)構(gòu)


    image.png
image.png
參考:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芒粹,一起剝皮案震驚了整個濱河市兄纺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌化漆,老刑警劉巖估脆,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異座云,居然都是意外死亡疙赠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門朦拖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圃阳,“玉大人,你說我怎么就攤上這事璧帝『丛溃” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵睬隶,是天一觀的道長锣夹。 經(jīng)常有香客問我,道長苏潜,這世上最難降的妖魔是什么银萍? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮恤左,結(jié)果婚禮上贴唇,老公的妹妹穿的比我還像新娘。我一直安慰自己飞袋,他們只是感情好滤蝠,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著授嘀,像睡著了一般物咳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹄皱,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天览闰,我揣著相機(jī)與錄音,去河邊找鬼巷折。 笑死压鉴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锻拘。 我是一名探鬼主播油吭,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼击蹲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婉宰?” 一聲冷哼從身側(cè)響起歌豺,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎心包,沒想到半個月后类咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蟹腾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年痕惋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃殖。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡值戳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炉爆,到底是詐尸還是另有隱情堕虹,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布叶洞,位于F島的核電站鲫凶,受9級特大地震影響禀崖,放射性物質(zhì)發(fā)生泄漏衩辟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一波附、第九天 我趴在偏房一處隱蔽的房頂上張望艺晴。 院中可真熱鬧,春花似錦掸屡、人聲如沸封寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狈究。三九已至,卻和暖如春盏求,著一層夾襖步出監(jiān)牢的瞬間抖锥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工碎罚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留磅废,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓荆烈,卻偏偏與公主長得像拯勉,于是被迫代替她去往敵國和親竟趾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容