• 跨域


    什么是跨域

    跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对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类上面或者某个方法上面写上跨域的注解即可

  • 相关阅读:
    Linux中OCI开发库的配置
    makefile中的gcc -o $@ $^是什么意思?
    【转】gcc中的-w -W和-Wall选项
    【转】Linux查看系统是32位还是64位方法总结
    【转】gcc命令中参数c和o混合使用的详解
    Python2.7设置在shell脚本中自动补全功能的方法
    Python3设置在shell脚本中自动补全功能的方法
    Pyqt图标下载网站
    如何使QLineEdit禁止编辑
    python偏函数的运用
  • 原文地址:https://www.cnblogs.com/dzcici/p/10026095.html
Copyright © 2020-2023  润新知