response 对象设置返回响应头 header
设置项有下面这几项
response.setHeader("Access-Control-Allow-Origin", originHeader); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "content-type"); response.setHeader("Access-Control-Allow-Credentials", "true");
普通的跨域请求,如 GET, POST
response.setHeader("Access-Control-Allow-Origin","*"); response.setHeader("Access-Control-Allow-Methods", "*");
POST 请求的时候,会先发送 OPTIONS 请求, 设置预请求缓存1个小时,1个小时内不再发送OPTIONS请求
response.setHeader("Access-Control-Max-Age", "3600");
特殊的请求头,需要明确写上,后台才能接收到, 如 content-type
response.setHeader("Access-Control-Allow-Headers", "content-type");
跨域请求时带cookie, 需要设置接收 cookie 的设置 Credentials,并且明确写明接收的 IP地址
response.setHeader("Access-Control-Allow-Origin","http:yourip"); response.setHeader("Access-Control-Allow-Credentials", "true");
需要设置多个IP,参考 获取session
前端需要取某些header,必须后端提供Access-Control-Expose-Headers,前端才能拿到。
response.setHeader("Access-Control-Expose-Headers", "need-header-name")
以上的设置都是在java代码上做的,还可以在 Nginx 上进行配置
SpringBoot 配置
Controller层代码: @CrossOrigin
@RequestMapping("/demo") @RestController @CrossOrigin("https://blog.csdn.net") // 只有这个指定域名可以访问该类下所有接口 public class CorsTestController { @GetMapping("/sayHello") public String sayHello() { return "hello world !"; } }
CORS
全局配置
新建跨域配置类:CorsConfig.java
@Configuration public class CorsConfig implements WebMvcConfigurer { @Bean public WebMvcConfigurer corsConfigurer(){ return new WebMvcConfigurer() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/*"). allowedOrigins("https://www.dustyblog.cn"). //允许跨域的域名,可以用表示允许任何域名使用 allowedMethods(""). //允许任何方法(post、get等) allowedHeaders(""). //允许任何请求头 allowCredentials(true). //带上cookie信息 exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L); //maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果 } }; } }
拦截器实现
通过实现Fiter接口在请求中添加一些Header来解决跨域的问题
@Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.addHeader("Access-Control-Allow-Credentials", "true"); res.addHeader("Access-Control-Allow-Origin", "*"); res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN"); if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) { response.getWriter().println("ok"); return; } chain.doFilter(request, response); } @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws ServletException { } }
参考:
https://blog.csdn.net/weixin_42036952/article/details/88564647