【发布时间】:2023-01-06 22:18:10
【问题描述】:
假设
我们正在使用以下库开发 Web 应用程序。
当请求从前端发送到后端时,会出现 CORS 错误。
- 前端:Vue.js(版本:3)
- 后端:Spring Boot(版本:2.7.6)
- 身份验证:Spring Security
我们想要达到的目标
我们希望解决以下从前端向后端发送请求时出现的 CORS 错误。
Access to XMLHttpRequest at 'http://localhost:8085/users/profile/1' from origin 'http://localhost:8888' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
源代码
在 Vue.js (Edit.vue) 中向 Spring 发送请求
onClickDelete() {
const path = 'users/profile/'
axios.delete(
process.env.VUE_APP_ROOT_API + path + this.$store.state.user_id,{
headers: {
"Authorization": "Bearer " + this.$store.state.jwt_token,
},
})
.then(response => {
})
.catch(error => {
console.log(error)
})
},
Spring中的接收流程(UsersController.java)
@RestController
@RequestMapping("/users/profile")
public class UsersController {
@DeleteMapping("/{user_id}")
@ResponseStatus(code = HttpStatus.NO_CONTENT, value = HttpStatus.NO_CONTENT)
public void profiledelete(@PathVariable("user_id") Long id) throws Exception {
}
}
SpringSecurity配置文件(WebSecurityConfig.java)
@Profile("production")
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserRepository userRepository;
private final JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider;
@Value("${security.secret-key:secret}")
private String secretKey = "secret";
public WebSecurityConfig(JsonRequestAuthenticationProvider jsonRequestAuthenticationProvider// ,
) {
this.jsonRequestAuthenticationProvider = jsonRequestAuthenticationProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
JsonRequestAuthenticationFilter jsonAuthFilter =
new JsonRequestAuthenticationFilter(userRepository);
jsonAuthFilter.setAuthenticationManager(authenticationManagerBean());
http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues());
http.addFilter(jsonAuthFilter);
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.exceptionHandling().accessDeniedHandler(accessDeniedHandler())
.and()
.csrf().
disable()
.addFilterBefore(tokenFilter(), UsernamePasswordAuthenticationFilter.class)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
;
}
我们尝试了什么
@CrossOrigin 到Spring中接收进程的进程(UsersController.java)
我们做了什么
Spring接收流程(UsersController.java)
@RestController
@RequestMapping("/users/profile")
@CrossOrigin
public class UsersController {
@DeleteMapping("/{user_id}")
@ResponseStatus(code = HttpStatus.NO_CONTENT, value = HttpStatus.NO_CONTENT)
public void profiledelete(@PathVariable("user_id") Long id) throws Exception {
}
}
结果
仍然显示 CORS 错误。
附加信息
- 在安装 SpringSecurity 之前,我认为在 Spring 端授予 @CrossOrigin 解决了 CORS 错误。
- 当在其他请求中使用 GET 方法时,在 Spring 端成功且没有任何 CORS 错误。
【问题讨论】:
标签: spring-boot spring-security cors