如何处理从您的 servlet 中的 angular 应用程序发送的预检请求?
How to handle the preflight request send from an angular application in your servlet?
我正在 Angular 中创建一个项目,它从 localhost:8080 上的 tomcat 应用程序 运行 获得 json 用户。现在我正在尝试使用 http.put 更新用户。当我发送我的放置请求时,我在我的控制台中打印了这个错误:
Access to XMLHttpRequest at 'http://localhost:8080/Servlet?command=UpdateUser' from origin 'http://localhost:4200' 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.
我的 servlet 使用 handlerfactory,它可以生成正确的处理程序来处理请求。 UpdateUser 处理程序现在有此代码:
public class UpdateUser extends RequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> params = request.getParameterNames();
System.out.println(params);
while (params.hasMoreElements()) {
String paramName = params.nextElement();
System.out.println(paramName + ":" + request.getParameter(paramName));
}
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
response.addHeader("Access-Control-Expose-Headers", "xsrf-token");
response.setStatus(HttpServletResponse.SC_ACCEPTED);
}
}
注意:我只是将 while 循环放在那里,这样我就能够看到我的 angular 应用程序中的内容是如何到达我的处理程序的。
在我的 angular 应用程序的 app.component.ts 中,我有这个代码来更新用户:
updateUser(user): void {
this.userService.updateUser(user).subscribe();
}
这在我的 user.service.ts:
中调用了这个方法
private httpOptions = {headers: new HttpHeaders({
'Content-Type': 'application/json'
})};
updateUser(user): Observable<User> {
return this.http.put<User>(this.updateUsersUrl, user, this.httpOptions);
}
在控制台的网络选项卡中,我看到调用了我的处理程序,但没有打印任何内容。
所以我想我可能需要在其他地方处理我的预检请求?
覆盖我的 servlet 中的 doOptions 方法并在那里设置所有 headers,似乎解决了问题
我正在 Angular 中创建一个项目,它从 localhost:8080 上的 tomcat 应用程序 运行 获得 json 用户。现在我正在尝试使用 http.put 更新用户。当我发送我的放置请求时,我在我的控制台中打印了这个错误:
Access to XMLHttpRequest at 'http://localhost:8080/Servlet?command=UpdateUser' from origin 'http://localhost:4200' 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.
我的 servlet 使用 handlerfactory,它可以生成正确的处理程序来处理请求。 UpdateUser 处理程序现在有此代码:
public class UpdateUser extends RequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> params = request.getParameterNames();
System.out.println(params);
while (params.hasMoreElements()) {
String paramName = params.nextElement();
System.out.println(paramName + ":" + request.getParameter(paramName));
}
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "X-PINGOTHER,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization");
response.addHeader("Access-Control-Expose-Headers", "xsrf-token");
response.setStatus(HttpServletResponse.SC_ACCEPTED);
}
}
注意:我只是将 while 循环放在那里,这样我就能够看到我的 angular 应用程序中的内容是如何到达我的处理程序的。
在我的 angular 应用程序的 app.component.ts 中,我有这个代码来更新用户:
updateUser(user): void {
this.userService.updateUser(user).subscribe();
}
这在我的 user.service.ts:
中调用了这个方法 private httpOptions = {headers: new HttpHeaders({
'Content-Type': 'application/json'
})};
updateUser(user): Observable<User> {
return this.http.put<User>(this.updateUsersUrl, user, this.httpOptions);
}
在控制台的网络选项卡中,我看到调用了我的处理程序,但没有打印任何内容。 所以我想我可能需要在其他地方处理我的预检请求?
覆盖我的 servlet 中的 doOptions 方法并在那里设置所有 headers,似乎解决了问题