Java 飞行前的响应具有无效的HTTP状态代码401-Spring
各位。 我是Angular 2和Spring框架的新手。 我正在尝试一个带有授权头(basicauth)的简单get请求 我正在使用SpringBoot(1.2.6.RELEASE),这也可能是相关的。 我的CORS配置如下所示Java 飞行前的响应具有无效的HTTP状态代码401-Spring,java,spring,angular,cors,Java,Spring,Angular,Cors,各位。 我是Angular 2和Spring框架的新手。 我正在尝试一个带有授权头(basicauth)的简单get请求 我正在使用SpringBoot(1.2.6.RELEASE),这也可能是相关的。 我的CORS配置如下所示 @Component public class SimpleCorsFilter implements Filter { private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class
@Component
public class SimpleCorsFilter implements Filter {
private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class);
public SimpleCorsFilter() {
log.info("SimpleCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, authorization, x-auth-token");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
下面是客户端的外观
this.headers.append('Authorization', 'Basic dXNlcjphZG1pbg==');
return this.http
.get(`http://localhost:8080/api/login?username=${username}`, {headers : this.headers} )
.map(response => response.json().data as any);
}
我不断得到:
无法加载XMLHttpRequest
. 飞行前响应
具有无效的HTTP状态代码401
请帮忙,我不知道我错过了什么。。。
我已经检查了很多帖子,但都没有找到…避免过滤,并在http方法为OPTIONS时设置状态200
if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
如果有人在使用Spring Boot、Spring Security和angular 2/4之类的客户端时遇到类似情况,我已经发布了这些发现 对于那些正在寻找简短答案的人,您必须配置两件事:
@CrossOrigin
配置,如下所示:
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
.allowedHeaders("*");
}
};
}
}
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}
干杯 另一个选项,如spring安全指南: 在扩展WebSecurity ConfigureAdapter configure cors()的安全配置类中
这可能会很晚,但这可以解决一些问题,经过长时间的工作,我找到了答案
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
public void configure( WebSecurity web ) throws Exception
{
web.ignoring().antMatchers( HttpMethod.OPTIONS, "/**" );
}
}
REFEREHTTP 401表示由于缺少授权而无法满足您的请求,请检查是否正常。能否删除响应。setHeader(“访问控制允许凭据”,“true”);试试看?@TharsanSivakumar,也有同样的想法,无论如何谢谢相关的:谢谢@Eswar,我再也不会犯错误了。然而,忽略选项请求是一个好的实现吗?我这样问是因为我真的不知道。我们可以验证请求头并发送状态代码,而无需筛选。每当我们在标头中发送授权时,浏览器就会发出飞行前请求,所以我们只是验证来源并抛出错误状态代码。忽略选项不会影响其他http方法,因为我们正在进行筛选,但我不确定它的实现是否良好。虽然此链接可能会回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能无效。-@克尔伍德更新了答案,但为什么不投票呢??这有点像是根据封面判断一本书吗?如果我没有更新答案的话,我会很感激的。这应该是最重要的答案——经过数小时的Spring文档检索,github和SOI花了几个小时才找到这个答案。
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
public void configure( WebSecurity web ) throws Exception
{
web.ignoring().antMatchers( HttpMethod.OPTIONS, "/**" );
}
}