跨域是指在浏览器中,当前网页向不同域名(或不同端口、不同协议)的接口发送请求时,浏览器会拦截这些请求,防止跨域攻击。为了解决跨域问题,需要在服务器端添加一些响应头信息,告诉浏览器允许跨域访问。
关于跨域有很多种解决方法,这里我使用过滤器来解决跨域的问题。我们使用了一个过滤器(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");
}
}