Springboot处理跨域请求

2022-03-15 14:37:11 浏览数 (1)

一、跨域背景

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 {     } }

0 人点赞