Java登陆第四十二天——跨域
浏览器拥有最基本的安全机制,同源策略。
违背同源策略的交互,会被浏览器认为是不安全的交互,所以不解析。
什么是域?(源)
协议,域名,端口。
什么是跨域?
访问不同的域。
即便协议,域名相同,端口号不一样也会违背同源策略。
前后端分离后,前端服务器负责视图,后端服务器负责数据。
不同的服务器,其域必定不同。
假设前端服务器为localhost:5173
假设后端服务器为localhost:8080
所以,前端请求后端,后端响应的数据浏览器不会解析。
一图了解跨域
跨域的解决办法
常见的两种解决办法
前端代理请求
此解决办法简单有效,但会加大前端服务器压力。
后端跨域过滤器
最常见的跨域处理方式.
服务器会在接收到预检请求后,会响应一堆跨域响应头且响应状态码为200。(预检请求在过滤器内部就会结束,不会继续向后。)
预检请求使用的请求方法通常是OPTIONS
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT,OPTIONS, DELETE, HEAD");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
Servlet跨域过滤器举例
@WebFilter("/*")
public class CrosFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
System.out.println(request.getMethod());
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT,OPTIONS, DELETE, HEAD");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
// 如果是跨域预检请求,则直接在此响应200业务码
if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
WebUtil.writeJson(response, Result.ok(null));
} else {
// 非预检请求,放行即可
filterChain.doFilter(servletRequest, servletResponse);
}
}
}