一、跨域背景
1.1 什么是跨域?
Url的一般格式: 协议 域名(子域名 主域名) 端口号 资源地址 只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。
1.2 Cors是什么?
- CORS全称为Cross Origin Resource Sharing(跨域资源共享), 每一个页面需要返回一个名为Access-Control-Allow-Origin的http头来允许外域的站点访问,你可以仅仅暴露有限的资源和有限的外域站点访问。
- 我们可以理解为:如果一个请求需要允许跨域访问,则需要在http头中设置Access-Control-Allow-Origin来决定需要允许哪些站点来访问。如假设需要允https://cloud.tencent.com这个站点的请求跨域,则可以设置: Access-Control-Allow-Origin:https://cloud.tencent.com。
二.解决方案
2.1 在Controller上使用@CrossOrigin注解
该类下的所有接口都可以通过跨域访问
代码语言:javascript复制@RequestMapping("/demo2") @RestController //@CrossOrigin //所有域名均可访问该类下所有接口
@CrossOrigin("https://cloud.tencent.com") // 只有指定域名可以访问该类下所有接口
public class CorsTest2Controller {
@GetMapping("/sayHello")
public String sayHello() {
return "hello world --- 2";
}
}
2.2 过滤器实现 通过实现Fiter接口在请求中添加一些Header来解决跨域的问题
代码语言:javascript复制@Component public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponzse 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");//允许header中哪些参数跨域
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 { } }