0.什么是跨域?
说到跨域,就要先讲讲“同源策略”。
同源策略:一个网络上的所有信息必须来源于同一个服务器,即 协议、域名、端口均相同则为同源策略。
跨域:不符合同源策略的请求为跨域请求。即在访问的http://127.0.0.1:8080的服务器中,发送ajax请求到服务器http://127.0.0.1:8081服务器中,这时违背了同源策略中的端口一致原则,此时就属于跨域。
1.前端IE10之后都允许了跨域请求,所以无需处理
2.后端处理
package com.itheima.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 跨域资源共享过滤器:
* 用于告知浏览器,本服务器返回的所有资源允许跨域展示
*/
@WebFilter("/*")
public class CorsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 获取请求来源
String origin = request.getHeader("Origin");
System.out.println("请求来源为: "+origin);
// if(origin.equals("http://localhost:8080")||origin.equals("http://localhost:8081")){
response.setHeader("Access-Control-Allow-Origin", origin);
// TODO:设置允许跨域 这行设置可以解决跨域的简单请求
//表示允许请求时的origin值(发出请求的网址)
response.setHeader("Access-Control-Allow-Origin", "*");
// 设置cookie跨域共享
response.setHeader("access-control-allow-credentials", "true");
// TODO: 非简单请求 "预检"
/*
# 预检时,告诉浏览器允许的请求方式有哪些
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
# 预检时,告诉浏览器允许携带的请求头有哪些
Access-Control-Allow-Headers:content-type
# 预检时,告诉浏览器允许的起源有哪些
Access-Control-Allow-Origin: *
# 预检完成后,告诉浏览器本次预检生效的时长
Access-Control-Max-Age: 3600
*/
// TODO:预检时,告诉浏览器允许的请求方式有哪些
//response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Methods", "*");
// TODO:预检时,告诉浏览器允许携带的请求头有哪些
response.setHeader("Access-Control-Allow-Headers", "*");
//如果需要携带多个请求头(包括自定义的请求头),可以加
// response.setHeader("Access-Control-Allow-Headers", "content-type,authorization");
// TODO:# 预检完成后,告诉浏览器本次预检生效的时长
response.setHeader("Access-Control-Max-Age", "3600");
// 放行
chain.doFilter(req, resp);
// }
}
public void init(FilterConfig config) throws ServletException {
}
}