返回

SpringBoot玩转CORS跨域请求

后端

SpringBoot作为一款轻量级框架,以其简洁的配置和方便的上手体验,深受广大开发者的喜爱。在前后端分离的开发模式中,H5前端调用后端的URL接口时,一般会采用Ajax来实现调用。然而,浏览器对Ajax的调用会存在跨域的限制,这可能导致无法正常调用后端接口。

为了解决跨域问题,SpringBoot提供了多种方式。在本文中,我们将重点介绍如何使用Spring Security来配置跨域请求访问。Spring Security是SpringBoot中的一款安全框架,它提供了多种安全特性,包括跨域访问控制。

Spring Security配置跨域请求访问

要使用Spring Security配置跨域请求访问,需要在SpringBoot项目中添加Spring Security依赖。在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

添加依赖后,需要在SpringBoot项目的启动类中启用Spring Security。在SpringBoot项目的启动类中添加以下代码:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() {
        return new WebSecurityConfigurerAdapter() {
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.cors().disable();
            }
        };
    }
}

以上代码启用了Spring Security,并禁用了跨域访问控制。

启用跨域请求访问

要启用跨域请求访问,需要在Spring Security的配置类中添加以下代码:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()
                .csrf().disable();
    }
}

以上代码启用了Spring Security的跨域访问控制,并禁用了CSRF保护。

配置跨域访问规则

在Spring Security中,可以通过@CrossOrigin注解来配置跨域访问规则。@CrossOrigin注解可以添加到控制器类或方法上。

如果将@CrossOrigin注解添加到控制器类上,则该控制器下的所有方法都将允许跨域访问。例如:

@CrossOrigin
@RestController
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

如果将@CrossOrigin注解添加到方法上,则只有该方法允许跨域访问。例如:

@RestController
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @CrossOrigin
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
}

跨域访问请求头和方法

默认情况下,Spring Security只允许跨域访问OPTIONS、GET、HEAD和POST请求。如果需要允许其他请求方法,可以在@CrossOrigin注解中指定允许的请求方法。例如:

@CrossOrigin(methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
@RestController
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @PutMapping("/users/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userRepository.save(user);
    }

    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}

跨域访问响应头

默认情况下,Spring Security只允许跨域访问Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Expose-Headers和Access-Control-Max-Age响应头。如果需要允许其他响应头,可以在@CrossOrigin注解中指定允许的响应头。例如:

@CrossOrigin(exposedHeaders = {"X-My-Custom-Header"})
@RestController
public class UserController {

    @GetMapping("/users")
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
}

总结

在本文中,我们介绍了如何使用Spring Security来配置跨域请求访问。Spring Security提供了多种方式来配置跨域请求访问,包括使用@CrossOrigin注解、配置WebSecurityConfigurerAdapter等。通过本文的讲解,希望您能够学会如何使用Spring Security来配置跨域请求访问,并解决前后端分离开发模式中遇到的跨域问题。