首页 > 其他分享 >SpringBoot设置跨域的几种方式

SpringBoot设置跨域的几种方式

时间:2023-01-10 14:00:57浏览次数:43  
标签:Control SpringBoot 几种 Access import servlet public 跨域

    • 什么是跨域?

        浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 

      原因:

        由于浏览器的同源策略, 即a网站只能访问a网站的内容,不能访问b网站的内容.

      注意:

        跨域问题只存在于浏览器,也就是说当你的前端页面访问后端简单请求的接口时,返回值是有的,只是服务器没有在请求头指定跨域的信息,所以浏览器自动把返回值给"屏蔽了".

        经过上面的了解,可以得出几个解决跨域的方法(不考虑前端实现):

        1.服务端指定跨域信息

        2.在web页面与服务器之间加一层服务指定跨域信息,比如nginx
       

      使用springboot提供了跨域的方法:

        1.5版本为继承WebMvcConfigurerAdapter 类实现抽象方法,

      //springboot 1.5方式
      @Configuration
      public class WebMvcConfig extends WebMvcConfigurerAdapter {
       
        @Override
        public void addCorsMappings(CorsRegistry registry) {
          registry.addMapping("/**").allowedHeaders("*")
            .allowedMethods("*")
            .allowedOrigins("*")
            .allowCredentials(true);
        }
      }

      2.0以后为实现WebMvcConfigurer 接口重写方法

      //springboot 2.0以上的方式
      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
       
          @Override
          public void addCorsMappings(CorsRegistry registry) {
              registry.addMapping("/**")
                      .allowedHeaders("Content-Type","X-Requested-With","accept,Origin","Access-Control-Request-Method","Access-Control-Request-Headers","token")
                      .allowedMethods("*")
                      .allowedOrigins("*")
                      .allowCredentials(true);
          }
      }

      使用拦截器实现跨域:

      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      import org.springframework.web.servlet.config.annotation.CorsRegistry;
      import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
      import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
       
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
       
      @Configuration
      public class WebMvcConfig implements WebMvcConfigurer {
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(new HandlerInterceptor() {
                  @Override
                  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                      response.addHeader("Access-Control-Allow-Origin", "*");
                      response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                      response.addHeader("Access-Control-Allow-Headers",
                              "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");
                      return true;
                  }
       
                  @Override
                  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
       
                  }
       
                  @Override
                  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
       
                  }
              });
          }
       
      }

      注意:

      请求头中自定义的字段是不允许跨域的,所以要指定

      response.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");

      或者

      response.addHeader("Access-Control-Allow-Headers", "*");

      还可以使用servlet提供的过滤器进行跨域配置:

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import javax.servlet.http.Cookie;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      /**
       * 请求的基本过滤器 预处理请求头
       */
      @Component
      @WebFilter(urlPatterns = {"/*"}, filterName = "tokenAuthorFilter")
      public class TokenAuthorFilter implements Filter {
      
          private static Logger LOG = LoggerFactory.getLogger(TokenAuthorFilter.class);
      
          @Override
          public void destroy() {
      
          }
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response,
                               FilterChain chain) throws IOException, ServletException {
              HttpServletRequest req = (HttpServletRequest) request;
              HttpServletResponse rep = (HttpServletResponse) response;
      
              HttpSession session = req.getSession();
              LOG.info("sessionId:{}", session.getId());
              //LOG.info("Origin:{}", req.getHeader("Origin"));
      
              //设置允许跨域的配置
              // 这里填写你允许进行跨域的主机ip(正式上线时可以动态配置具体允许的域名和IP)
              rep.setHeader("Access-Control-Allow-Origin", "*");
              //rep.setHeader("Access-Control-Allow-Origin", "*");
              rep.setHeader("Access-Control-Expose-Headers", jwtProperties.getHeader());
              // 允许的访问方法
              rep.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
              // Access-Control-Max-Age 用于 CORS 相关配置的缓存
              rep.setHeader("Access-Control-Max-Age", "3600");
              rep.setHeader("Access-Control-Allow-Headers", "token, Origin, X-Requested-With, Content-Type, Accept");
              //若要返回cookie、携带seesion等信息则将此项设置我true
              rep.setHeader("Access-Control-Allow-Credentials", "true");
              // 把获取的Session返回个前端Cookie
              //rep.addCookie(new Cookie("JSSESIONID", session.getId()));
              chain.doFilter(req, rep);
      
          }
      
          @Override
          public void init(FilterConfig arg0) throws ServletException {
      
          }
      
      }

      灵活的跨域方式:

        如果我们只想提供一个方法可以跨域,那么可以使用注解的形式:

      @CrossOrigin
      @RestController
      public class TestController {
      
      }
 

 

标签:Control,SpringBoot,几种,Access,import,servlet,public,跨域
From: https://www.cnblogs.com/tiancai/p/17040118.html

相关文章

  • springboot集成caffine本地缓存
    一、缓存算法1.FIFOFIFO(FirstinFirstout)先进先出。可以理解为是一种类似队列的算法实现算法:当一个查询请求命中了某个元素之后,便会将它放入到队列中,后续的命中元素也......
  • Shell判断字符串包含关系的几种方法
    现在每次分析网站日志的时候都需要判断百度蜘蛛是不是真实的蜘蛛,nslookup之后需要判断结果中是否包含“baidu”字符串以下给出一些shell中判断字符串包含的方法,来源程序......
  • SpringBoot整合ueditor编辑器
    1.到ueditor编辑器官网下载jsp版(目前官网地址改为了GitHub)​​https://ueditor.baidu.com/website/download.html​​2.下载解压后复制到当前项目3.导入maven依赖<de......
  • Spring Boot---(25)SpringBoot使用AOP
    摘要:本文示例,是在一个简单的SpringBoot项目中,通过AOP技术,来实现对接口访问时的信息统计,和接口耗时统计。AOP是Spring提供的两个核心功能之一:IOC(控制反转),AOP(AspectOriented......
  • @ComponentScan详解&@SpringBootApplication的scanBasePackages属性
    一、@ComponentScan源码@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Repeatable(ComponentScans.class)public@interfaceComponen......
  • 【转】Vue+springboot集成PageOffice实现在线编辑Word、excel文档
    说明:PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件......
  • SpringBoot整合ueditor编辑器
    1.到ueditor编辑器官网下载jsp版(目前官网地址改为了GitHub)​​https://ueditor.baidu.com/website/download.html​​2.下载解压后复制到当前项目3.导入maven依赖<dependenc......
  • Springboot集成Disruptor做内部消息队列
    一、基本介绍Disruptor的github主页:https://github.com/LMAX-Exchange/disruptor1,什么是Disruptor? (1)Disruptor是英国外汇交易公司LMAX开发的一个高性能的并发框架......
  • java后端解决跨域问题
    一、问题来源最近同事开发一个功能,提供接口给第三方调用,第三方调用时直接前端进行调用的因此触发了跨域拦截,报错如下: 二、解决方法可以要求第三方在自己后端......
  • 关于SpringBoot多数据源的实现与增加不同拦截器的实现
    1.SpringBoot多数据源的实现在参考了各个文档之后有jpa形式配置文件多为.yml快速搭建springbootmaven项目多数据源https://blog.csdn.net/pete1024/article/details/10......