您好,欢迎访问一九零五行业门户网

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@restcontrolleradvicepublic 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拦截器
@componentpublic 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拦截器
@componentpublic 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显示跨域问题怎么解决的详细内容。
其它类似信息

推荐信息