跨域(Access-Control-Allow-Origin)解决方案详解

php 在服务端代码里面加 header信息

header("Access-Control-Allow-Origin: *"); //如果需要设置允许所有域名发起的跨域请求,可以使用通配符 *
或者
header("Access-Control-Allow-Origin: www.xxx.xom");

 

Java中设置多个Access-Control-Allow-Origin跨域访问

1、如果服务端是Java开发的,添加如下设置允许跨域即可,但是这样做是允许所有域名都可以访问,不够安全。
response.setHeader("Access-Control-Allow-Origin","*");
2、为保证安全性,可以只添加部分域名允许访问,添加位置可以在下面三处任选一个。
(1)可以在过滤器的filter的dofilter()方法种设置。
(2)可以在servlet的get或者post方法里面设置。
(3)可以放在访问的jsp页面第一行。
3、在此用第一种方法,注意web.xml配置过滤器(filter)。

public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
        // 将ServletResponse转换为HttpServletResponse
        HttpServletResponse httpResponse = (HttpServletResponse) res;
        // 如果不是80端口,需要将端口加上,如果是集群,则用Nginx的地址,同理不是80端口要加上端口
    String []  allowDomain= {"http://www.baidu.com","http://123.456.789.10","http://123.16.12.23:8080"};
    Set allowedOrigins= new HashSet(Arrays.asList(allowDomain));
    String originHeader=((HttpServletRequest) req).getHeader("Origin");
    if (allowedOrigins.contains(originHeader)){
        httpResponse.setHeader("Access-Control-Allow-Origin", originHeader);
            httpResponse.setContentType("application/json;charset=UTF-8");
            httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            httpResponse.setHeader("Access-Control-Max-Age", "3600");
            httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
            // 如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true
            httpResponse.setHeader("Access-Control-Allow-Credentials", "true");                                
            httpResponse.setHeader("Access-Control-Expose-Headers", "*");        
        }        
        chain.doFilter(req, res);
} 

基于nginx配置请求的CORS

目前很多请求都不是直接暴露的,很多通过nginx做反向代理,因此可以使用nginx配置固定请求的Access-Control-Allow-Origin,实现跨域访问。方式是在被请求的接口,配置location代理,添加header实现。

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Headers "x-requested-with,Authorization";
add_header Access-Control-Allow-Methods *;

 更多参考:https://www.jianshu.com/p/3967c00cca09

posted @ 2020-08-26 16:31  persevere.琳  阅读(29203)  评论(0)    收藏  举报