webplus / blog

前端开发日志
63 stars 6 forks source link

CORS跨域AJAX请求带Cookie的问题 #12

Open webplus opened 8 years ago

webplus commented 8 years ago

客户端

$.ajax({
    url : 'http://remote.domain.com/corsrequest',
   //支持跨域发送cookies    
   xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    contentType: "application/json",
...

服务端JAVA

/**
* Spring Controller中的方法:
*/
    @RequestMapping(value = "/corsrequest")
    @ResponseBody
    public Map<String, Object> getUserBaseInfo(HttpServletResponse response) {
        if(request.getHeader("Origin").contains("woego.cn")) {
            response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        }
        response.setHeader("Access-Control-Allow-Credentials", "true");
        ...
}

使用了Nginx服务器的情况

如果使用了Nginx服务器那只需要如下配置,不需要在代码额外设置了 Access-Control-Allow-Origin: | // 授权的源控制 Access-Control-Max-Age: // 授权的时间 Access-Control-Allow-Credentials: true | false // 控制是否开启与Ajax的Cookie提交方式 Access-Control-Allow-Methods: [, ] // 允许请求的HTTP Method Access-Control-Allow-Headers: [, ]* // 控制哪些header能发送真正的请求

Java中使用跨域 Filter

当允许跨域访问的接口较多时,在每个请求中都添加 Access-Control-Allow-Origin 显然是不合适的。对于比较原生的 Java web 应用,使用 Filter 是一个不错的选择。

NOTE:不同的框架,特别是支持REST的框架,大多提供了自己的跨域设置方式,如Spring4的Config等,可以优先从使用的框架中寻找支持。

Filter本身很简单,可以直接把上面两句设置 Header 的语句抽取出来写一个Filter。这里推荐一个 Tomcat 中的 Filter:org.apache.catalina.filters.CorsFilter。

引入 这个类在 Tomcat 的 catalina.jar 中,可以通过将 tomcat/lib 下的 jar 包引用到项目中的方式来使用。但如果你对项目的 jar 环境有’洁癖’, 也可以单独把 这个类的 SVN源码 拷贝到项目中,修改(删除)一下‘日志’和‘异常提示内容’的引用就可以运行在任何原生java web项目中了。

设置方法 在 web.xml 中设置Filter:

CorsFilter org.apache.catalina.filters.CorsFilter CorsFilter /*

一点补充: Filter的 默认 设置包含了:

CorsFilter org.apache.catalina.filters.CorsFilter cors.allowed.origins * cors.support.credentials true CorsFilter /*

这里的 cors.allowed.origins 虽然是 ‘*’,但实现上已经被优化,不会与 credentials 冲突。