跨域

定义

由于浏览器遵循同源策略,所以当⼀个请求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 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);
    }
}

你可能感兴趣的:(跨域)