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