跨域

作者: 菜鸟要逆袭 | 来源:发表于2021-11-21 21:35 被阅读0次

    定义

    由于浏览器遵循同源策略,所以当⼀个请求url的协议、域名、端⼝三者之间任意⼀个与当前⻚⾯url不同即为跨域

    同源策略(浏览器策略)

    同源策略(Same origin policy)是⼀种约定,它是浏览器最核⼼也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的⼀种实现。
    同源策略是浏览器的⾏为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,浏览器会先发送OPTION请求进⾏预检查,判断服务器是否允许跨域,如果允许才发送真正的请求,否则抛出异常。
    同源限制
    ⽆法读取⾮同源⽹⻚的 Cookie、LocalStorage 和 IndexedDB
    ⽆法向⾮同源地址发送 A JAX 请求

    何时产生跨域

    浏览器在解析执⾏⼀个⽹⻚时,如果⻚⾯中的js代码请求了另⼀个⾮同源的资源,则会产⽣跨越问题,⽽浏览器直接跳转另⼀个⾮同源的地址时不会有跨域问题

    跨域解决

    /*1.需要在响应头中明确指出对方是可信的(表示在未设置响应头时,跨域可以进行访问,但不会给出应有响应)
     * 2.  * 表示允许所有来源的跨域访问,正式使用时填写指定静态资源服务器地址
     * 3.每一个资源的响应均需要设置响应头,这非常麻烦,所以可以使用过滤器
     * */
    response.setHeader("Access-Control-Allow-Origin","*");
    
    /*使用过滤器简化设置响应头操作*/
    @WebFilter(urlPatterns = "/*")
    public class CROSFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            /*
            * 动态设置 通过代码获取origin 来判断要不要允许
            * 允许跨域访问的主机地址列表
            * */
            ArrayList<String> hosts = new ArrayList<>();
            hosts.add("http://localhost:8020");
            hosts.add("http://localhost:8030");
    
            HttpServletRequest request = (HttpServletRequest) servletRequest;
    
            /*判断对方是否在允许的范围*/
            if (hosts.contains(request.getHeader("Origin"))){
                /*从请求中获取Origin的值*/
                ((HttpServletResponse)servletResponse).setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
            }
    
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:跨域

          本文链接:https://www.haomeiwen.com/subject/hkmzzltx.html