同源禁止策略
同源策略是浏览器的一种安全策略,要求协议、域名、端口都相同才能互相访问
如果其中有一个不相同,浏览器会禁止页面加载或执行与自身不同域的脚本
这个策略有助于阻隔恶意文档,减少可能被攻击的媒介
前端:http://localhost:5173/
后端:http://localhost:8080/
我们发现,前后端端口不同,就会被浏览器当成不同的服务器,会触发同源禁止策略,从而浏览器无法直接向后端发送请求
代理请求
为了解决这个问题,我们可以直接让前端发送请求到后端,浏览器只需要读取数据,这种处理模式叫代理模式
但前端本身就会处理很多的业务,再让他自己去往后端发请求,会大大加重前端服务器的负载
预检请求
为了确认能够跨域,浏览器提前向后端发送一个预检请求,后端会响应一些告知客户端可以跨域的信息
预检请求之后,客户端再发送正式的请求
预检请求无需发送多次,只有在浏览器第一次请求后端时发送一次
跨域过滤器
为了解决这个问题,我们在后端建立跨域过滤器,如果是预检请求,响应允许跨域的信息
如果不是预检请求,就直接放行
跨域过滤器并不要求我们自己写,等学到MVC框架之后,直接一个注解即可搞定
尚硅谷给我们提供了一个跨域过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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"); if(request.getMethod().equalsIgnoreCase("OPTIONS")){ WebUtil.writeJson(response, Result.ok(null)); }else{ filterChain.doFilter(servletRequest, servletResponse); } } }
|