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和拦截器无法处理跨域的主要内容,如果未能解决你的问题,请参考以下文章

springmvc使用weblogic发布,怎么配置

角度拦截器和 CORS

SpringMvc CORS跨域设置

以角度添加拦截器后的CORS问题

springmvc 拦截器 拦截成功怎么返回登录页面

SpringMVC学习11SpringMVC中的拦截器