跨域是指在浏览器中,当前网页向不同域名(或不同端口、不同协议)的接口发送请求时,浏览器会拦截这些请求,防止跨域攻击。为了解决跨域问题,需要在服务器端添加一些响应头信息,告诉浏览器允许跨域访问。
关于跨域有很多种解决方法,这里我使用过滤器来解决跨域的问题。我们使用了一个过滤器(CorsFilter)来处理跨域请求。在过滤器中,我们先通过request.getHeader("Origin")
获取请求中的Origin头信息,即客户端的域名。然后将该域名添加到响应头的Access-Control-Allow-Origin
字段中,告诉浏览器允许来自该域名的请求。
同时,我们还添加了Access-Control-Allow-Methods
字段,指定了允许的请求方法,包括GET、HEAD、POST、PUT和DELETE。这样就可以满足大部分常见的请求方法。
最后,我们还添加了Access-Control-Allow-Headers
字段,指定了允许的请求头。这个字段是可选的,根据实际情况确定需要允许的请求头。在这个示例中,我们允许了Authorization和Content-Type两个常见的请求头。
注意:我们的过滤器要在security过滤器链之前进行过滤,节省资源,所以order要小于Spring Security中的过滤器链的order,我这里是-101,Spring Security中的过滤器链默认是100,较低的值表示较高的优先级,较高的值表示较低的优先级。
通过以上的设置,我们就可以在服务器端解决跨域问题,允许来自指定域名的请求访问接口。
/** * @author jinze * @version 1.0 * @description: 跨域过滤器 * @date 2023/8/14 15:55 */ @Component @Order(Const.ORDER_CORS) public class CorsFilter extends HttpFilter { @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { this.addCorsHeader(request, response); // 添加跨域头信息 chain.doFilter(request, response); // 继续处理请求 } /** * 添加跨域头信息 */ private void addCorsHeader(HttpServletRequest request, HttpServletResponse response) { // 允许哪个域名进行跨域访问 response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); // 允许的请求方法 response.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE"); // 允许的请求头 response.addHeader("Access-Control-Allow-Headers", "Authorization, Content-Type"); } }