您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“SpringBoot攔截器返回false顯示跨域問題怎么解決”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“SpringBoot攔截器返回false顯示跨域問題怎么解決”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
項目最近添加了一個ip黑白名單的功能, 發(fā)現(xiàn)如果ip過濾的攔截器返回 false 后前端會顯示跨域, 嘗試修改MVC配置類后發(fā)現(xiàn)還是不行, 最后在攔截器加了個判斷就可以了
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // ----------- 加上這個就好了 ----------- if (!(handler instanceof HandlerMethod)) { return true; } }
WebMvcConfigurer 配置類
@Configuration @RestControllerAdvice public class WebMvcConfig implements WebMvcConfigurer { @Resource private IpFilterInterceptor ipFilterInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // IP攔截器 registry.addInterceptor(ipFilterInterceptor) .addPathPatterns("/**") .order(5); } @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowCredentials(true) .allowedOriginPatterns("*") .allowedMethods("*") .allowedHeaders("*") .maxAge(3600); } }
修改前的 IP攔截器
@Component public class IpFilterInterceptor implements HandlerInterceptor { /** * 是否啟用 */ private boolean enable; /** * 是否為白名單 */ private boolean isWhiteList; /** * 過濾器 */ private List<String> filters; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // 停用 if (!enable) { return true; } String ip = Servlets.getRemoteAddr(request); // 本機不過濾 if (Const.LOCALHOST_IP_V4.equals(ip)) { return true; } // 過濾 boolean contains = false; for (String filter : filters) { if (Strings.isBlank(filter)) { continue; } // 檢測 contains = Utils.checkIpIn(ip, filter); if (contains) { break; } } // 結(jié)果 boolean pass; if (isWhiteList) { pass = contains; } else { pass = !contains; } // 返回 if (!pass) { response.setContentType(StandardContentType.APPLICATION_JSON); Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes()); } return pass; } }
修改后的 IP攔截器
@Component public class IpFilterInterceptor implements HandlerInterceptor { /** * 是否啟用 */ private boolean enable; /** * 是否為白名單 */ private boolean isWhiteList; /** * 過濾器 */ private List<String> filters; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { // 停用 if (!enable) { return true; } // ----------- 加上這個就好了 ----------- if (!(handler instanceof HandlerMethod)) { return true; } String ip = Servlets.getRemoteAddr(request); // 本機不過濾 if (Const.LOCALHOST_IP_V4.equals(ip)) { return true; } // 過濾 boolean contains = false; for (String filter : filters) { if (Strings.isBlank(filter)) { continue; } // 檢測 contains = Utils.checkIpIn(ip, filter); if (contains) { break; } } // 結(jié)果 boolean pass; if (isWhiteList) { pass = contains; } else { pass = !contains; } // 返回 if (!pass) { response.setContentType(StandardContentType.APPLICATION_JSON); Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes()); } return pass; } }
最后, 問題的原因是出在了攔截器身上 需要在 preHandle 中 判斷 handler 的類型必須是 HandlerMethod 的話才能通過
讀到這里,這篇“SpringBoot攔截器返回false顯示跨域問題怎么解決”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。