springboot使用filter獲取自定義請(qǐng)求頭的實(shí)現(xiàn)代碼
有個(gè)錢(qián)包項(xiàng)目,本來(lái)用的是微服務(wù)這一套,后來(lái)感覺(jué)沒(méi)必要,重構(gòu)成了簡(jiǎn)單的springboot項(xiàng)目,但是token校驗(yàn)重構(gòu)完之后出問(wèn)題了,之前寫(xiě)filter走的是springgateway,基于GatewayFilter實(shí)現(xiàn),重構(gòu)了之后基于filter,然后當(dāng)請(qǐng)求進(jìn)入過(guò)濾器的時(shí)候,發(fā)現(xiàn)不能獲取到請(qǐng)求的自定義請(qǐng)求頭。
String token = request.getHeader("token"); // null String id = request.getHeader("id"); // null String role = request.getHeader("role"); // null
原因
我在進(jìn)入斷點(diǎn)的時(shí)候查看了一下servletRequest,發(fā)現(xiàn)請(qǐng)求方法是options。 我知道get post delete put。還真不了解options,百度了下。主要參考這篇文章。原來(lái)是瀏覽器的同源策略問(wèn)題,也就是cors,可我一想,我配置了cors啊
@Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1 corsConfiguration.addAllowedHeader("*"); // 2 corsConfiguration.addAllowedMethod("*"); // 3 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); // 4 return new CorsFilter(source); } }
怎么還報(bào)跨域的問(wèn)題呢,想起來(lái)了我的tokenFilter里因?yàn)槟貌坏秸?qǐng)求頭token,我拋出了參數(shù)異常,然后@RestControllerAdvice跟@ExceptionHandle處理不了filter中拋出的異常,導(dǎo)致程序報(bào)500錯(cuò)誤,然后過(guò)濾器是類(lèi)似于切面的 么,這里斷了導(dǎo)致返回頭也沒(méi)加上。
處理
怎么處理瀏覽器發(fā)過(guò)來(lái)的預(yù)處理 options請(qǐng)求呢,太懶了,直接這樣寫(xiě)了
HttpServletRequest request= (HttpServletRequest)servletRequest; HttpServletResponse res = (HttpServletResponse) servletResponse; String method=request.getMethod(); if(HttpMethod.OPTIONS.toString().equals(method)){ res.setStatus(HttpStatus.NO_CONTENT.value()); }else { String token = request.getHeader("token"); String id = request.getHeader("id"); String role = request.getHeader("role"); ~~~~~~~
回想
我記得我上個(gè)項(xiàng)目也沒(méi)處理options請(qǐng)求啊,怎么沒(méi)報(bào)cors問(wèn)題啊,對(duì)了我記得我在nginx處理過(guò)了
if ($request_method = 'OPTIONS') { return 204; } add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Headers "Content-Type, Authorization" always; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE, HEAD" always; add_header Access-Control-Max-Age 86400 always;
原來(lái)自己又寫(xiě)前端,也寫(xiě)后端,怎么這些問(wèn)題還能碰到呢,:relieved:,前輩們都寫(xiě)好了,自己還沒(méi)遇到問(wèn)題也沒(méi)深入過(guò),還有springcloud里面的corsWebFilter怎么就跟springboot里面的corsFilter不一樣呢。
@Configuration public class CorsConfig { @Bean public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source); } }
還是得多看源碼啊,我這個(gè)crudboy
總結(jié)
以上所述是小編給大家介紹的springboot使用filter獲取自定義請(qǐng)求頭的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
idea創(chuàng)建properties文件,解決亂碼問(wèn)題
這篇文章主要介紹了idea創(chuàng)建properties文件,解決亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07基于springboot微信公眾號(hào)開(kāi)發(fā)(微信自動(dòng)回復(fù))
這篇文章主要介紹了基于springboot微信公眾號(hào)開(kāi)發(fā)(微信自動(dòng)回復(fù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11java中關(guān)于文本文件的讀寫(xiě)方法實(shí)例總結(jié)
這篇文章主要介紹了java中關(guān)于文本文件的讀寫(xiě)方法,實(shí)例總結(jié)了Java針對(duì)文本文件讀寫(xiě)的幾種常用方法,并對(duì)比了各個(gè)方法的優(yōu)劣及特點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
這篇文章主要介紹了SpringBoot整合RabbitMQ的5種模式的注解綁定詳解,RabbitMQ 是一個(gè)消息中間件,它接收消息并且轉(zhuǎn)發(fā),是"消費(fèi)-生產(chǎn)者模型"的一個(gè)典型的代表,一端往消息隊(duì)列中不斷的寫(xiě)入消息,而另一端則可以讀取或者訂閱隊(duì)列中的消息,需要的朋友可以參考下2024-01-01Java并發(fā)編程學(xué)習(xí)之ThreadLocal源碼詳析
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程學(xué)習(xí)之源碼分析ThreadLocal的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06Java連接操作Oracle數(shù)據(jù)庫(kù)代碼詳解
這篇文章主要介紹了Java連接操作Oracle數(shù)據(jù)庫(kù)代碼詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06JAVA浮點(diǎn)數(shù)計(jì)算精度損失底層原理與解決方案
本文主要介紹了JAVA浮點(diǎn)數(shù)計(jì)算精度損失底層原理與解決方案。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理
這篇文章主要介紹了springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04