1、实现
以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
public class GlobalCorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
//允许所有的域访问,可以设置只允许自己的域访问
//服务器只需要告诉浏览器允许的域
response.setHeader("Access-Control-Allow-Origin", "*");
//response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com");
//允许所有方式的请求(GET、POST),用于告知浏览器哪些方法是被允许的
response.setHeader("Access-Control-Allow-Methods", "*");
//指定了预检请求(OPTIONS请求)的有效期,单位为秒。在有效期内,浏览器可以直接发送实际请求,而无需再次发送预检请求。
//(如果不设 Chromium 同时规定了一个默认值 5 秒),没有缓存将以OPTIONS进行预请求
response.setHeader("Access-Control-Max-Age", "3600");
//允许的头信息,告知浏览器哪些自定义请求头字段是被允许的
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
//代表是预检请求
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
//直接让预检请求返回200,告诉浏览器可以发送实际请求了
response.setStatus(HttpServletResponse.SC_OK);
} else {
//添加完头部信息后,直接放行
chain.doFilter(req, res);
}
}
}
2、一些问题
关于各项请求头的作用
关于预检请求
简言之就是发送OPTION请求到服务器,服务器根据预检请求的请求头信息,自行判断是否允许跨域,并把判断结果放到响应的header中返回给浏览器。预检请求的请求头中包含了一些关键信息,例如请求方法、请求头字段、请求的URL等。以下是一个预检请求的示例:
请求方法:OPTIONS
URL:https://www.example.com/api/data
请求头字段:
Origin: https://www.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type
这个示例中,浏览器向 https://www.example.com 发送了一个OPTIONS请求,用于检查是否允许发送POST请求,并且是否允许包含Content-Type请求头字段。预检请求的服务器是当前URL的服务器,而不是跳转页面URL的服务器。预检请求是在发送实际请求之前进行的,用于检查服务器是否允许跨域请求。因此,预检请求会发送到当前URL的服务器,以获取服务器的许可。
3、一些补充
关于跨域的前端实现或者nginx实现,跳这篇:【跨域】 。文章部分概念贴图:
[截图来源:上面链接]
4、疑问点
我理解的是判断下是否为OPTION请求方式,是则加允许跨域的头部,不懂为啥旧项目给所有的请求都加:文章来源:https://www.toymoban.com/news/detail-848055.html
文章来源地址https://www.toymoban.com/news/detail-848055.html
到了这里,关于Java后端设置服务器允许跨域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!