SpringBoot 拦截器返回false显示跨域问题
项目最近添加了一个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; } } // 结果 xlcGT 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显示跨域问题的文章就介绍到这了,更多相关SpringBoot 跨域问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
推荐阅读
-
每个Java程序员必备的8个开发工具
本文由码农网 –王国峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!现在有很多库、实用工具和程序任J...
-
Java实战之医院管理系统的实现
目录项目介绍环境需要技术栈使用说明效果图展示核心代码用户管理控制层医生管理控制层病房管理控制层项目介绍医院管理系统,分为管理员、医...
-
elasticsearch索引index之Translog数据功能分析
目录translog的结构及写入方式translogFile的继承关系TranslogFile快照的方法总结translog的结构...
-
java实现简单发送邮件功能
-
Java实现图片比率缩放
-
Java中的JetCache 实战
-
elasticsearch索引index之engine读写控制结构实现
目录engine的实现结构Engine类的方法:如index方法的实现:总结engine的实现结构elasticsearch对于...
-
elasticsearch索引index之Mapping实现关系结构示例
目录Mapping的实现关系结构Mapper的三类parse方法部分Field总结Mapping的实现关系结构Lucene索引的...
-
LeetCode 动态规划之矩阵区域和详情
目录题目题解解题分析解题代码题目矩阵区域和给你一个mxn的矩阵mat和一个整数k,请你返回一个矩阵answer,其中每个a...
-
elasticsearch索引的创建过程index create逻辑分析
目录索引的创建过程materOperation方法实现clusterservice处理建立索引修改配置总结索引的创建过程从本篇...