gpt4 book ai didi

javascript - 预检响应具有无效的 HTTP 状态代码 : 401 angular

转载 作者:数据小太阳 更新时间:2023-10-29 05:49:23 26 4
gpt4 key购买 nike

我们尝试使用 Angular 和 Spring Boot 向我们的服务添加身份验证,但由于某些原因,我们无法“打开”并从我们知道有效的 URL 中获取数据

Angular :

this.getMismatches = function () {
return $http({
"async": true,
"crossDomain": true,
"url": GLOBALS.mismatchUrl,
"method": "GET",
"headers": {
"authorization": "Basic YWRtaW46USNROawdNmY3UWhxQDlQA1VoKzU="
}
});
}

(目前为了测试目的,登录 token 是硬编码的)

休息服务:

@CrossOrigin(origins = "*")
@RequestMapping("/api/mismatch")
public List<Mismatch> home() {
return service.getAll();
}

CrossOrigin = * 应该处理 CORS 问题,但这个失败的 URL 调用真的很奇怪。

我们尝试过的其他事情:

'Access-Control-Allow-Methods', 'GET, POST, OPTIONS'
'Access-Control-Allow-Origin', '*'
'Content-Type', json plaintext jsonp etc

App.js:
$httpProvider.defaults.headers.common = {};
$httpProvider.defaults.headers.post = {};
$httpProvider.defaults.headers.put = {};
$httpProvider.defaults.headers.patch = {};

最佳答案

您在评论中提到,通过使用 postman ,您可以获得预期的响应。这是一个很好的起点。我怀疑通过使用来自终端的 curl 命令 curl -i -X URL 也会返回正确的响应。

如果 postman 工作正常,你必须知道在发出请求之前 angular 发送另一个请求,称为 pre-flight 请求,它对端点进行最小检查服务器端。

这个请求是一个OPTIONS类型的请求。

首先,您必须确保您的dispatcherServlet 接受OPTIONS 请求。您可以通过在 *.properties 配置文件中指定它来实现这一点,例如:

spring.mvc.dispatch-options-request=true

或者通过配置web.xml

<servlet>
<!--content eluded for clarity-->
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
</servlet>

将其配置为接受 OPTIONS 请求后,创建一个 Filter.java 并配置一个 CORS 过滤器。

您可以通过以下示例进行指导:

public class CorsFilter implements Filter{

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {

if(response instanceof HttpServletResponse){
HttpServletResponse alteredResponse = ((HttpServletResponse)response);
addCorsHeader(alteredResponse);
}

filterChain.doFilter(request, response);
}

private void addCorsHeader(HttpServletResponse response){
//TODO: externalize the Allow-Origin
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");
response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept");
response.addHeader("Access-Control-Max-Age", "1728000");
}

@Override
public void destroy() {}

@Override
public void init(FilterConfig filterConfig)throws ServletException{}
}

最后,不要忘记在 web.xml 中添加此过滤器以及以下初始化参数。

<filter>
<filter-name>cors-filter</filter-name>
<filter-class>ai.surge.usrmngmtservice.util.cors.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,OPTIONS,PUT</param-value>
</init-param>
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Authorization,Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<!--<init-param>-->
<!--<param-name>cors.preflight.maxage</param-name>-->
<!--<param-value>1800</param-value>-->
<!--</init-param>-->
</filter>

你现在应该准备好了。

关于javascript - 预检响应具有无效的 HTTP 状态代码 : 401 angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42221602/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com