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);
// 本機(jī)不過濾
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);
// 本機(jī)不過濾
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 的話才能通過
到此這篇關(guān)于SpringBoot 攔截器返回false顯示跨域問題的文章就介紹到這了,更多相關(guān)SpringBoot 跨域問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java語言實現(xiàn)簡單FTP軟件 FTP本地文件管理模塊實現(xiàn)(9)
這篇文章主要為大家詳細(xì)介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP本地文件管理模塊的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
SpringBoot實現(xiàn)定時任務(wù)的三種方式小結(jié)
這篇文章主要介紹了SpringBoot實現(xiàn)定時任務(wù)的三種方式小結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11

