使用路径变量时错误 CORS Forbidden 403 Spring Boot With Spring Security
Error CORS Forbidden 403 Spring Boot With Spring Security when using Path Variable
我知道已经有很多关于这个主题的问题和答案,但是 none 在使用路径变量时提到这个错误。
我已经把这个配置
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.cors().and()
.csrf().disable()
.authorizeRequests().antMatchers("/file/getFile/**")
.permitAll().anyRequest().authenticated()
.and()
.httpBasic();
}
}
当我使用路径变量时,响应总是错误 403 Forbidden。
错误
@RequestMapping(value = "/file")
@Service
public class FileService {
.....
@CrossOrigin(origins="http://localhost:8080", allowCredentials = "true")
@RequestMapping(value = "/getFile/{fileId}", method = RequestMethod.POST)
@ResponseBody
public String getFile(@PathVariable(value = "fileId") String fileId) {
....
}
}
但如果我不使用路径变量,它就可以工作。
成功
@RequestMapping(value = "/file")
@Service
public class FileService {
.....
@CrossOrigin(origins="http://localhost:8080", allowCredentials = "true")
@RequestMapping(value = "/getFile", method = RequestMethod.POST)
@ResponseBody
public String getFile(@RequestBody String jsonFileId) {
....
}
}
我是从 javascript 调用的,下面是 javascript 请求方法。
url 例子
http://localhost:8088/file/getFile/PUML1pZvusTlfBnlW3
fdjElEw8O7iVXfj801GyFF7fWeqyvPzwf1GB9lwha3T9GOoq2KEDaqf01l
3DMRYInV9yHAMfd5_W4vY0S7d0SS9qk
和请求方式
$.ajax({
url:url,
type:"POST",
data:data,
dataType: 'json',
contentType: "application/json;",
crossDomain:true,
cache:false,
async:true,
success:success,
timeout:30000,
error:function(xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
}
}
});
javascript 错误:
Access to XMLHttpRequest at
'http://localhost:8088/file/getFile/PUML1pZvusTlf....
from origin 'http://localhost:8080' 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.
我知道我可以不用路径变量,但在我的情况下使用路径变量更有效。
那么这个问题有什么解决办法吗?谢谢
当您使用路径变量时,没有 POST body 并且浏览器不会发送 application/json Content-Type header。您的控制器端点不匹配,并且服务器不会以 Access-Control-Allow-Origin header 响应预检请求。尝试在 POST body.
中发送一些值
我知道已经有很多关于这个主题的问题和答案,但是 none 在使用路径变量时提到这个错误。
我已经把这个配置
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.cors().and()
.csrf().disable()
.authorizeRequests().antMatchers("/file/getFile/**")
.permitAll().anyRequest().authenticated()
.and()
.httpBasic();
}
}
当我使用路径变量时,响应总是错误 403 Forbidden。
错误
@RequestMapping(value = "/file")
@Service
public class FileService {
.....
@CrossOrigin(origins="http://localhost:8080", allowCredentials = "true")
@RequestMapping(value = "/getFile/{fileId}", method = RequestMethod.POST)
@ResponseBody
public String getFile(@PathVariable(value = "fileId") String fileId) {
....
}
}
但如果我不使用路径变量,它就可以工作。
成功
@RequestMapping(value = "/file")
@Service
public class FileService {
.....
@CrossOrigin(origins="http://localhost:8080", allowCredentials = "true")
@RequestMapping(value = "/getFile", method = RequestMethod.POST)
@ResponseBody
public String getFile(@RequestBody String jsonFileId) {
....
}
}
我是从 javascript 调用的,下面是 javascript 请求方法。 url 例子
http://localhost:8088/file/getFile/PUML1pZvusTlfBnlW3
fdjElEw8O7iVXfj801GyFF7fWeqyvPzwf1GB9lwha3T9GOoq2KEDaqf01l
3DMRYInV9yHAMfd5_W4vY0S7d0SS9qk
和请求方式
$.ajax({
url:url,
type:"POST",
data:data,
dataType: 'json',
contentType: "application/json;",
crossDomain:true,
cache:false,
async:true,
success:success,
timeout:30000,
error:function(xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
}
}
});
javascript 错误:
Access to XMLHttpRequest at
'http://localhost:8088/file/getFile/PUML1pZvusTlf....
from origin 'http://localhost:8080' 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.
我知道我可以不用路径变量,但在我的情况下使用路径变量更有效。 那么这个问题有什么解决办法吗?谢谢
当您使用路径变量时,没有 POST body 并且浏览器不会发送 application/json Content-Type header。您的控制器端点不匹配,并且服务器不会以 Access-Control-Allow-Origin header 响应预检请求。尝试在 POST body.
中发送一些值