亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何使用RequestHeaders添加自定義參數(shù)

 更新時(shí)間:2022年02月14日 09:32:48   作者:Clancey  
這篇文章主要介紹了使用RequestHeaders添加自定義參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。

RequestHeaders添加自定義參數(shù)

在開發(fā)過程中有的時(shí)候,參數(shù)需要綁定到requestHeaders中,而并不是在body中進(jìn)行傳輸。這個(gè)時(shí)候就需要我們自己定義參數(shù)(需要后臺(tái)的配合)

setToken() {
    let token = localStorage.getItem('token') ? localStorage.getItem('token') : ''
    this.instance.defaults.headers.common['tokens'] = token
  }
// 使用axios添加requestHeaders參數(shù)。封裝到ajax請求中~

問題一

在瀏覽器的console中報(bào)錯(cuò):自定義字段不被允許

Request header field自定義字段 is not allowed by Access-Control-Allow-Headers

原因

包含自定義header字段的跨域請求,瀏覽器會(huì)先向服務(wù)器發(fā)送OPTIONS請求,探測該服務(wù)器是否允許自定義的跨域字段。

如果允許,則繼續(xù)實(shí)際的POST/GET正常請求,否則,返回標(biāo)題所示錯(cuò)誤。

同時(shí)在requestHeaders請求中有你定義的字段,但結(jié)果不是我們想要的

在responseHeaders中Access-Control-Allow-Headers中表示服務(wù)器允許跨域請求的參數(shù)

Access-Control-Allow-Headers: Content-Type, x-requested-with, X-Custom-Header, Authorization,token

解決方案

服務(wù)端需要對OPTIONS請求做出應(yīng)答,應(yīng)答header中包含Access-Control-Allow-Headers,且值包含options請求中Access-Control-Request-Headers的值。

以下為java服務(wù)端filter中設(shè)置的OPTIONS請求處理代碼。

@Override 
public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException { 
    try { 
        HttpServletRequest hreq = (HttpServletRequest) req;  
        HttpServletResponse hresp = (HttpServletResponse) resp;
 
        //跨域
        hresp.setHeader("Access-Control-Allow-Origin", "*"); 
 
        //跨域 Header 
        hresp.setHeader("Access-Control-Allow-Methods", "*"); 
        hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,TOKENS");  // 在這里配置你要定義的參數(shù)         
 
        // 瀏覽器是會(huì)先發(fā)一次options請求,如果請求通過,則繼續(xù)發(fā)送正式的post請求 
        // 配置options的請求返回
 
        if (hreq.getMethod().equals("OPTIONS")) { 
            hresp.setStatus(HttpStatus.SC_OK); 
            // hresp.setContentLength(0); 
            hresp.getWriter().write("OPTIONS returns OK"); 
            return; 
        }
 
        // Filter 只是鏈?zhǔn)教幚?,請求依然轉(zhuǎn)發(fā)到目的地址。
 
        chain.doFilter(req, resp); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    } 
}

其中,這個(gè)就是所需設(shè)置的應(yīng)答Header:

hresp.setHeader("Access-Control-Allow-Headers", "Content-Type,TOKENS");

* header中對值的大小寫貌似不敏感。

修改request中header的值

在java web開發(fā)中,我們有時(shí)候會(huì)遇到需要修改request中請求值的問題,雖然這個(gè)不是特別常見。初看這是一個(gè)簡單的問題,因?yàn)槲覀兡芡ㄟ^HttpServletRequest對象拿到我們需要的所有關(guān)于當(dāng)前這個(gè)請求的所有信息,想當(dāng)然的也就可以修改所以這些信息??蓪?shí)際情況是HttpServletReques中很多的屬性只有g(shù)etter方法,而沒有setter方法,也就是說我們不可以修改他們。

記得第一次遇到這種問題還是初學(xué)編程的時(shí)候,最近又遇到這個(gè)問題,就記錄一下。最近遇到的是在spring mvc中,使用@RequestBody注解把requestBody中的json映射到j(luò)ava的object。我們知道對于spring mvc來說,這樣使用的時(shí)候需要在請求的header里面表明conten-type為application/json。如果完全是自己開發(fā)的系統(tǒng),沒有問題加上就是,但是當(dāng)和第三方合作的時(shí)候,請求的發(fā)起方式就不是我們能控制住的了?,F(xiàn)在的問題是如果使用spring mvc的這種開發(fā)模式,必須要在請求的header中設(shè)置content-type為application/json,但是第三方又不方便設(shè)置。所以只能在所有針對第三方的API中進(jìn)行特殊處理。

sping mvc是基于servlet的,我們只要在請求進(jìn)入servlet之前在header中設(shè)置content-type為application/json就ok了,所以理想的修改方式就是加入一個(gè)filter。現(xiàn)在就到了關(guān)鍵的問題:怎么修改請求的header值。答案是利用HttpServletRequestWrapper類。 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(new CustomeizedRequest((HttpServletRequest) request), response);
    } 
    private class CustomeizedRequest extends HttpServletRequestWrapper { 
        public CustomeizedRequest(HttpServletRequest request) {
            super(request);
        }
 
        @Override
        public Enumeration<String> getHeaders(String name) {
            if (null != name && name.equals("Content-Type")) {
                return new Enumeration<String>() {
                    private boolean hasGetted = false; 
                    @Override
                    public String nextElement() {
                        if (hasGetted) {
                            throw new NoSuchElementException();
                        } else {
                            hasGetted = true;
                            return "application/json;charset=utf-8";
                        }
                    } 
                    @Override
                    public boolean hasMoreElements() {
                        return !hasGetted;
                    }
                };
            }
            return super.getHeaders(name);
        }
    }

demo中只重寫了getHeaders方法,實(shí)際上嚴(yán)謹(jǐn)?shù)淖龇ㄊ莋etHeader(String name)方法也要被重寫。實(shí)質(zhì)上我們還是沒有改變header中的值的能力,但是我們重寫了getHeaders方法,當(dāng)發(fā)現(xiàn)是我們的Content-Type字段時(shí),只要返回我們想要設(shè)置的值就OK了。同理我們可以任意發(fā)揮,根據(jù)實(shí)際的情況去重寫相應(yīng)的方法。

說一下我在這里遇到的一個(gè)問題,在開發(fā)過程中使用的maven加jetty插件,運(yùn)行起來沒有問題。但是測試和生產(chǎn)環(huán)境用的是tomcat,上了測試環(huán)境發(fā)現(xiàn)沒有效果。第一感覺是不同的容器中Content-Type的大小寫或?qū)懛ú灰粯?。打了一個(gè)log繼續(xù)測試,發(fā)現(xiàn)tomcat好像根本沒進(jìn)入我的getHeaders方法,就開始懷疑tomcat和jetty的某些實(shí)現(xiàn)不一致,各種查找沒有結(jié)果。最后在本地?fù)Q成tomcat來debug,竟然進(jìn)入了重寫的getHeaders方法,再一看name的值是:content-type。粗心把log打錯(cuò)位置了。。。,剛開始猜想的是對的。

所以這里的name.equals("Content-Type")就要考慮大小寫和不同寫法的因素了(比如contenttype或ContentType)。

后來想了一下之所以會(huì)出現(xiàn)這個(gè)失誤有兩個(gè)原因:

  • 粗心 log打錯(cuò)位置
  • 自身對于容器不熟悉,而且之前遇到過tomcat和jetty對于某些請求作不同處理的情況,所以就找錯(cuò)了方向。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解

    SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 詳細(xì)聊一聊JavaWeb中的Request和Response

    詳細(xì)聊一聊JavaWeb中的Request和Response

    這篇文章主要給大家介紹了關(guān)于JavaWeb中Request和Response的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-02-02
  • springboot 多環(huán)境配置 yml文件版的實(shí)現(xiàn)方法

    springboot 多環(huán)境配置 yml文件版的實(shí)現(xiàn)方法

    這篇文章主要介紹了springboot 多環(huán)境配置 yml文件版的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)

    這篇文章主要為大家介紹了mall整合SpringSecurity及JWT實(shí)現(xiàn)認(rèn)證授權(quán)實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java BufferedReader相關(guān)源碼實(shí)例分析

    Java BufferedReader相關(guān)源碼實(shí)例分析

    這篇文章主要介紹了Java BufferedReader相關(guān)源碼實(shí)例分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)代碼

    Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)代碼

    這篇文章主要給大家介紹了關(guān)于Spring?Boot接口支持高并發(fā)具體實(shí)現(xiàn)的相關(guān)資料,在SpringBoot項(xiàng)目中通常我們沒有處理并發(fā)問題,但是使用項(xiàng)目本身還是支持一定的并發(fā)量,需要的朋友可以參考下
    2023-08-08
  • Spring data elasticsearch使用方法詳解

    Spring data elasticsearch使用方法詳解

    這篇文章主要介紹了Spring data elasticsearch使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    這篇文章主要介紹了Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法,本文使用apache-commons-net工具包時(shí)遇到這個(gè)問題,解決方法很簡單,需要的朋友可以參考下
    2015-05-05
  • Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例

    本篇文章主要介紹了Spring Boot項(xiàng)目利用Redis實(shí)現(xiàn)session管理實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 深入理解Java對象復(fù)制

    深入理解Java對象復(fù)制

    使用任何已有的工具,都沒有直接使用 get set 方式進(jìn)行,對象轉(zhuǎn)換的速度快,雖然get set 方式代碼對一些比較麻煩,但是效率要高一些的,推薦使用 MapStruct 方式.,需要的朋友可以參考下
    2021-05-05

最新評論