对比普通请求,跨越请求里面多了Origin字段:

增加跨越调用请求头:

后台运行所有域 和 所有方法:


使用Filter实现跨域


经过创建的 过滤器的过滤操作后,filter 解决 了 浏览器对跨域请求的拦截,当有多个地址需要进行相同操作时,可以使用"*"代替具体的地址,从而实现大范围的跨域请求
被调用方——Filter解决方案:
1. 浏览器是先执行后判断
2. 跨域请求和普通请求的区别:
跨域请求的请求头中多了一条信息:如下
origin : http://localhost:8081
这个值是当前请求的域名信息,如果 浏览器发现当前请求是跨域的时候,它就会在当前请求头中添加一个当前域的信息的字段;然后在请求返回的时候,它会检查响应头里面有没有允许跨域的信息存在,如果没有,它就会报错。
filter解决跨域方案:
①创建一个Bean,在bean中创建FilterRegistBean 的实例,根据该实例声明过滤的对象.addUrlPatter("/*");
②声明过滤器实例, .setFilter(new CrosFilter());
③在CrosFilter的方法中声明允许跨域请求的请求地址和请求方法,如果要通过所有的请求和地址,只需要将指定的地址和方法名修改为 "*" 即可




跨域请求:
在被调用方角度: 使用Filter 解决方案
跨域请求和普通请求的区别:
跨域请求的请求头中多了一条信息:如下
origin : http://localhost:8081
这个值是当前请求的域名信息,如果 浏览器发现当前请求是跨域的时候,它就会在当前请求头中添加一个当前域的信息的字段;然后在请求返回的时候,它会检查响应头里面有没有允许跨域的信息存在,如果没有,它就会报错。
浏览器如何检测跨域请求
实现Filter后
未实现Filter前
一、被调用解决方法-filter解决方案
@Bean
public FilterRegistrationBean registerFilter() {
@override
public void init(FilterConfig filterConfig) throws ServletException{
}
@override
public doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOExceprion, ServletException{
}
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Origin", "http://localhost:8081");
res.addHeader("Access-Control-Allow-Methods", "GET");
chain.doFilter(request, response);
}
被调用方解决
1、服务器端解决
2、Apache
3、Nginx
跨域请求的请求头多了一个Origin字段
被调用解决-filter解决方案
tomcat处理请求头
springboot 添加一个filter
指定可以访问的域名
指定可以访问的方法
被调用方解决:
服务器端实现:在响应头中返回规定字段,允许指定地址和指定方法请求数据,如果要指定多个,可以将地址和方法改成*号即可
NGINX配置
APACHE配置
被调用方解决:
服务器端实现:在响应头中返回规定字段,允许指定地址和指定方法请求数据,如果要指定多个,可以将地址和方法改成*号即可
NGINX配置
APACHE配置
Access-Control-Allow-Origin ,*
Access-Control-Allow-Methods,*
通过filter修改之后,响应头也会发生相应的变化了