spring boot中如何解决跨域问题

fiy 其他 13

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring Boot中解决跨域问题可以通过以下几种方式:

    1. 使用注解解决跨域问题
      可以在Controller类或者Controller的方法上使用@CrossOrigin注解来解决跨域问题。这个注解支持一些参数,可以设置允许跨域的域名、允许的请求方法等。例如:
    @RestController
    @CrossOrigin(origins = {"http://localhost:8080", "http://localhost:8081"}, methods = {RequestMethod.GET, RequestMethod.POST})
    public class UserController {
        // ...
    }
    
    1. 添加过滤器解决跨域问题
      可以通过实现Filter接口并重写doFilter方法来实现跨域请求的过滤。在doFilter方法中,通过设置响应头部的Access-Control-Allow-Origin字段来允许跨域请求。例如:
    @Component
    public class CorsFilter implements Filter {
     
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
            filterChain.doFilter(servletRequest, servletResponse);
        }
     
        // ...
    }
    
    1. 使用WebMvcConfigurer来配置跨域
      可以通过实现WebMvcConfigurer接口并重写addCorsMappings方法来配置全局的跨域请求处理。在addCorsMappings方法中,可以使用CorsRegistry来配置跨域设置。例如:
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
     
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("http://localhost:8080", "http://localhost:8081")
                    .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                    .allowedHeaders("Content-Type", "Authorization")
                    .maxAge(3600);
        }
     
        // ...
    }
    

    以上是在Spring Boot中解决跨域问题的三种方式,可以根据具体需求选择适合的方法来解决跨域问题。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring Boot中解决跨域问题有多种方法,下面列举了几种常见的解决方案:

    1. 使用注解@CrossOrigin:Spring Boot提供了@CrossOrigin注解来处理跨域请求。只需要在Controller类或方法上添加@CrossOrigin注解,即可允许指定的域名访问该接口。例如:
    @RestController
    public class MyController {
    
       @CrossOrigin(origins = "http://example.com")
       @GetMapping("/my-api")
       public String myApi() {
          return "Hello World!";
       }
    }
    

    上述代码表示只允许来自"http://example.com"域名的请求访问该接口。如果要允许所有域名访问,可以将origins参数设置为"*",但这样做存在安全风险。

    1. 添加全局跨域配置:在Spring Boot的配置类中,可以添加一个全局的跨域配置。创建一个类并实现WebMvcConfigurer接口,重写addCorsMappings方法来配置跨域请求的规则。例如:
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
    
       @Override
       public void addCorsMappings(CorsRegistry registry) {
          registry.addMapping("/**")
                  .allowedOrigins("http://example.com")
                  .allowedMethods("GET", "POST", "PUT", "DELETE")
                  .allowedHeaders("*")
                  .allowCredentials(true)
                  .maxAge(3600);
       }
    }
    

    上述代码表示允许"http://example.com"域名的所有请求方法(GET、POST、PUT、DELETE),允许携带所有头信息,允许携带凭证(如Cookie),并设置请求的最大有效时间为3600秒。

    1. 使用Filter过滤器:通过自定义Filter来处理跨域请求。创建一个类并实现javax.servlet.Filter接口,重写doFilter方法来过滤请求。例如:
    @WebFilter(urlPatterns = "/*")
    public class CorsFilter implements Filter {
    
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          HttpServletRequest httpRequest = (HttpServletRequest) request;
          HttpServletResponse httpResponse = (HttpServletResponse) response;
    
          httpResponse.setHeader("Access-Control-Allow-Origin", "http://example.com");
          httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
          httpResponse.setHeader("Access-Control-Allow-Headers", "*");
          httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
          httpResponse.setHeader("Access-Control-Max-Age", "3600");
    
          chain.doFilter(httpRequest, httpResponse);
       }
    }
    

    上述代码中,使用ServletResponse.setHeader方法来设置响应头信息,允许"http://example.com"域名的所有请求方法,允许携带所有头信息,允许携带凭证,并设置请求的最大有效时间。

    1. 使用第三方库:除了以上方法,还可以使用一些第三方库来处理跨域请求,如Spring Cloud Gateway、Zuul等。这些库提供了更强大的跨域支持和配置选项,可以满足更复杂的需求。

    需要注意的是,在配置跨域请求时,应当仔细考虑安全性问题,并合理设置允许访问的域名、请求方法、头信息等。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring Boot中解决跨域问题可以通过以下几种方式:

    1. 使用@CrossOrigin注解
      可以在Controller中的方法或类上添加@CrossOrigin注解来解决跨域问题。@CrossOrigin注解接受以下几个参数:
    • origins:允许访问的源,默认为"*",表示允许所有源访问。
    • methods:允许的HTTP方法,默认为GET、HEAD和POST。
    • allowedHeaders:允许的请求头,默认为空。
    • exposedHeaders:响应头中允许暴露的字段,默认为空。
    • allowCredentials:是否允许发送Cookie,默认为false。
    • maxAge:预检请求的有效期,默认为1800秒。

    示例:

    @RestController
    @CrossOrigin(origins = "http://example.com", methods = {RequestMethod.GET, RequestMethod.POST})
    public class MyController {
        // controller methods...
    }
    
    1. 使用Filter实现跨域处理
      创建一个自定义的CorsFilter类,实现javax.servlet.Filter接口,然后在doFilter方法中添加跨域处理的逻辑。

    示例:

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class CorsFilter implements Filter {
     
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {
     
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*"); // 设置允许访问的源
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); // 设置允许的HTTP方法
            response.setHeader("Access-Control-Max-Age", "3600"); // 设置预检请求的有效期
     
            HttpServletRequest request = (HttpServletRequest) req;
            if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { // 处理预检请求
                response.setStatus(HttpServletResponse.SC_OK);
            } else {
                chain.doFilter(req, res);
            }
        }
     
        @Override
        public void destroy() {}
     
        @Override
        public void init(FilterConfig config) throws ServletException {}
    }
    

    然后,在启动类中添加@ServletComponentScan注解,将自定义的Filter类加入到过滤器链中。

    示例:

    @SpringBootApplication
    @ServletComponentScan
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    
    1. 使用WebMvcConfigurer配置类
      创建一个实现WebMvcConfigurer接口的配置类,并重写addCorsMappings方法来配置跨域处理。

    示例:

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
     
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*") // 允许的源
                    .allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的HTTP方法
                    .allowedHeaders("*") // 允许的请求头
                    .exposedHeaders("header1", "header2") // 响应头中允许暴露的字段
                    .allowCredentials(false) // 是否允许发送Cookie
                    .maxAge(3600); // 预检请求的有效期
        }
    }
    

    以上是在Spring Boot中解决跨域问题的三种常用方法,根据实际需求选择适合的方法来解决跨域问题。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部