springmvc拦截器使CORS anaotion和拦截器无法处理跨域
Posted
技术标签:
【中文标题】springmvc拦截器使CORS anaotion和拦截器无法处理跨域【英文标题】:Springmvc interceptors makes CORS annaotion and interceptors fail to handle Cross-domain 【发布时间】:2018-07-21 03:28:11 【问题描述】:我的项目中有一个自定义拦截器,我在我的控制器上放了一个 @CrossOrigin(origins = "*", maxAge = 3600)。
当我不使用自定义拦截器时,@CrossOrigin 有效,
但是当我使用我的自定义拦截器时,@CrossOrign 不起作用!
我也尝试使用我的自定义 CorsInterceptor 来处理问题,但是, 它也不起作用
如何解决跨域问题?
这是我的自定义 CorsInterceptor:
public class ProcessInterceptor implements HandlerInterceptor
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS,PUT, HEAD, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
response.setHeader("Access-Control-Allow-Credentials", "true");
return true;
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception
// TODO Auto-generated method stub
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception
// TODO Auto-generated method stub
这是我的 mvc 配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.dorm.interceptor.ProcessInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/static/css/**" />
<mvc:exclude-mapping path="/user/login" />
<mvc:exclude-mapping path="/student/login" />
<mvc:exclude-mapping path="/static/fonts/**" />
<mvc:exclude-mapping path="/static/js/**" />
<mvc:exclude-mapping path="/static/img/**" />
<mvc:exclude-mapping path="/user/testsession" />
<mvc:exclude-mapping path="/swagger-ui.html" />
<mvc:exclude-mapping path="/swagger-resources/**" />
<mvc:exclude-mapping path="/webjars/**" />
<mvc:exclude-mapping path="/v2/**" />
<bean class="com.dorm.interceptor.LoginAndPermInter"></bean>
</mvc:interceptor>
</mvc:interceptors>
控制器上的@CrossOrgin
@CrossOrigin(origins = "*", maxAge = 3600)
public class UserLoginController //...
【问题讨论】:
【参考方案1】:如果你使用 mvc XML 命名空间,我推荐你使用 mvc:cors 命名空间。 我不确定这是一个确切的解决方案,但我成功了。
-- mvc XML 命名空间--
<!-- CORS -->
<mvc:cors>
<mvc:mapping path="/**" allowed-origins="*"/>
</mvc:cors>
根据 Spring Framework 中的 CORS 支持,CORS 请求包括带有 OPTIONS 方法的预检请求。这意味着应该在某些请求(如 GET 或 POST)之前请求 OPTIONS 方法。因此,如果您尝试通过拦截器处理授权,您可能会在 preHandle 上为 OPTIONS 方法添加一些操作。实际上,这取决于浏览器。 IE 没关系,但对于 Chrome 和 Firefox 来说是必需的。
https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
-- 拦截器 Bean--
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception
if (request.getMethod().equals("OPTIONS"))
// return true or Some actions to avoid CORS;
【讨论】:
以上是关于springmvc拦截器使CORS anaotion和拦截器无法处理跨域的主要内容,如果未能解决你的问题,请参考以下文章