跨域

什么是跨域

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

同源策略限制了一下行为:

  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM 和 JS 对象无法获取
  • Ajax请求发送不出去

常见的跨域场景

所谓的同源是指,域名、协议、端口均为相同。

http://www.nealyang.cn/index.html 调用   http://www.nealyang.cn/server.php  非跨域

http://www.nealyang.cn/index.html 调用   http://www.neal.cn/server.php  跨域,主域不同

http://abc.nealyang.cn/index.html 调用   http://def.neal.cn/server.php  跨域,子域名不同

http://www.nealyang.cn:8080/index.html 调用   http://www.nealyang.cn/server.php  跨域,端口不同

https://www.nealyang.cn/index.html 调用   http://www.nealyang.cn/server.php  跨域,协议不同

localhost   调用 127.0.0.1 跨域


可使用JSONP

另一种方式在服务端使用过滤解决

自行编写Filter解决跨域

 @Override
    public void init(FilterConfig config) throws ServletException {
        //得到配置参数
        String initParameter = config.getInitParameter("allow-origin");
        //首次加载判断
        if(initParameter != null ){
            if(initParameter.equals("*")){
                origins = new String[]{"*"};
            }else{
                origins = initParameter.split(",");
            }
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //跨域,得到头部的Origin
        String origin = req.getHeader("Origin");
        if(origin != null && !origin.isEmpty()){
            for (String s : origins) {
                if(s.equals("*") || s.equals(origin)){
                   //设置头部响应回去
                    resp.setHeader("Access-Control-Allow-Origin",origin);
                    break;
                }
            }
            filterChain.doFilter(req,resp);
        }
    }

    @Override
    public void destroy() {

    }
}
 <filter>
        <filter-name>myCors</filter-name>
        <filter-class>com.dz147.Filter.MyCorsFilter</filter-class>
        <init-param>
            <param-name>allow-origin</param-name>
            <param-value>*</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>myCors</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 如有使用SSM框架提供了一个更加便捷的方式只需要在Controll类上面或者某个方法上面写上跨域的注解即可

原文地址:https://www.cnblogs.com/dzcici/p/10026095.html