springboot過濾器執(zhí)行兩次的解決及跨域過濾器問題
springboot過濾器執(zhí)行兩次的解決及跨域過濾器
在進(jìn)行springboot整合過濾器的過程中可能會(huì)遇到過濾器執(zhí)行兩次的問題
針對(duì)這個(gè)問題可能出現(xiàn)的一種原因就是因?yàn)樵谡?qǐng)求執(zhí)行完之后瀏覽器會(huì)再發(fā)一次請(qǐng)求.ico的請(qǐng)求
解決的方法就是在執(zhí)行過濾器方法之前再加一層判斷就好了.
HttpServletRequest request = (HttpServletRequest)servletRequest; if (request.getRequestURL().toString().matches(".+.ico$")) { filterChain.doFilter(servletRequest, servletResponse); } else { // do something yourself filterChain.doFilter(servletRequest, servletResponse); }
在不使用框架提供的跨域的方案的情況下可以自己注冊(cè)一個(gè)通用的跨域請(qǐng)求過濾器,具體的代碼如下
首先先注冊(cè)一個(gè)過濾器
到springboot
@Bean public FilterRegistrationBean corsFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); CorsFilter corsFilter = new CorsFilter(); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.setFilter(corsFilter); return filterRegistrationBean; }
具體過濾器的代碼
如下
public class CorsFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; if (request.getRequestURL().toString().matches(".+.ico$")) { filterChain.doFilter(servletRequest, servletResponse); } else { String origin = request.getHeader("Origin"); // 簡(jiǎn)單請(qǐng)求跨域,如果是跨域請(qǐng)求在響應(yīng)頭里面添加對(duì)應(yīng)的Origin if (!StringUtils.isEmpty(origin)) { response.addHeader("Access-Control-Allow-Origin", origin); } // 非簡(jiǎn)單請(qǐng)求跨域 response.addHeader("Access-Control-Allow-Headers", "content-type"); // 允許跨域請(qǐng)求的方法 response.addHeader("Access-Control-Allow-Methods", "*"); // 預(yù)檢命令緩存 1小時(shí) // response.addHeader("Access-Control-Max-Age", "3600"); // 攜帶cookie的跨域 response.addHeader("Access-Control-Allow-Credentials", "true"); // 放行方法 filterChain.doFilter(servletRequest, servletResponse); } } @Override public void destroy() { } }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis-Plus通用CRUD操作的實(shí)現(xiàn)
MyBatis-Plus是基于MyBatis的增強(qiáng)工具,主要目的是簡(jiǎn)化MyBatis的使用并提升開發(fā)效率,它提供了通可以用CRUD操作、分頁插件、多種插件支持、自動(dòng)代碼生成器等功能,感興趣的可以了解一下2024-10-10java編程實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例過程
這篇文章主要為大家介紹了如何使用java編程實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Java中實(shí)現(xiàn)代碼優(yōu)化的技巧分享
這篇文章主要跟大家談?wù)剝?yōu)化這個(gè)話題,那么我們一起聊聊Java中如何實(shí)現(xiàn)代碼優(yōu)化這個(gè)問題,小編這里有幾個(gè)實(shí)用的小技巧分享給大家,需要的可以參考一下2022-08-08Java啟用Azure Linux虛擬機(jī)診斷設(shè)置
這篇文章主要介紹了Java啟用Azure Linux虛擬機(jī)診斷設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05深入探究Java中的HashMap為什么會(huì)產(chǎn)生死循環(huán)
HashMap?死循環(huán)發(fā)生在?JDK?1.8?之前的版本中,這篇文章主要來和大家深入探究一下為什么Java中HashMap會(huì)產(chǎn)生死循環(huán),感興趣的小伙伴可以了解一下2023-05-05Java中如何將String轉(zhuǎn)JSONObject
這篇文章主要介紹了Java中如何將String轉(zhuǎn)JSONObject,String類型轉(zhuǎn)JSONObject,下面有兩種方式可以進(jìn)行轉(zhuǎn)換,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05