项目最近添加了一个ip黑白名单的功能, 发现如果ip过滤的拦截器返回 false 后前端会显示跨域, 尝试修改mvc配置类后发现还是不行, 最后在拦截器加了个判断就可以了
@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;
}
}
// 结果
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;
}
}
// 结果
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显示跨域问题怎么解决的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号