Java登陆第四十二天——跨域

浏览器拥有最基本的安全机制,同源策略。
	违背同源策略的交互,会被浏览器认为是不安全的交互,所以不解析。

什么是域?(源)
	协议,域名,端口。

什么是跨域?
	访问不同的域。
	即便协议,域名相同,端口号不一样也会违背同源策略。

前后端分离后,前端服务器负责视图,后端服务器负责数据。
	不同的服务器,其域必定不同。
	假设前端服务器为localhost:5173
	假设后端服务器为localhost:8080
	所以,前端请求后端,后端响应的数据浏览器不会解析。

一图了解跨域

image

跨域的解决办法

常见的两种解决办法

前端代理请求

image

此解决办法简单有效,但会加大前端服务器压力。

后端跨域过滤器

image
最常见的跨域处理方式.

服务器会在接收到预检请求后,会响应一堆跨域响应头且响应状态码为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);
        }
    }

}
posted @ 2024-04-14 15:21  rowbed  阅读(17)  评论(0编辑  收藏  举报