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 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 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 跨域问题内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图