同源禁止策略
同源禁止策略
同源策略是浏览器的一种安全策略,要求协议、域名、端口都相同才能互相访问
如果其中有一个不相同,浏览器会禁止页面加载或执行与自身不同域的脚本
这个策略有助于阻隔恶意文档,减少可能被攻击的媒介
我们发现,前后端端口不同,就会被浏览器当成不同的服务器,会触发同源禁止策略,从而浏览器无法直接向后端发送请求
代理请求
为了解决这个问题,我们可以直接让前端发送请求到后端,浏览器只需要读取数据,这种处理模式叫代理模式
但前端本身就会处理很多的业务,再让他自己去往后端发请求,会大大加重前端服务器的负载
预检请求
为了确认能够跨域,浏览器提前向后端发送一个预检请求,后端会响应一些告知客户端可以跨域的信息
预检请求之后,客户端再发送正式的请求
预检请求无需发送多次,只有在浏览器第一次请求后端时发送一次
跨域过滤器
为了解决这个问题,我们在后端建立跨域过滤器,如果是预检请求,响应允许跨域的信息
如果不是预检请求,就直接放行
跨域过滤器并不要求我们自己写,等学到MVC框架之后,直接一个注解即可搞定
尚硅谷给我们提供了一个跨域过滤器
import com.xiaobai.schedule.common.Result;
import com.xiaobai.schedule.util.WebUtil;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/*")
public class CrosFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
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);
}
}
}