我正在Angular中创建一个项目,该项目从在localhost:8080上运行的tomcat应用程序获取用户的json。现在,我正在尝试使用http.put更新用户。当我发送看跌期权请求时,我在控制台中看到此错误:
从源'http://localhost:8080/Servlet?command=UpdateUser'到'http://localhost:4200'处对XMLHttpRequest的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:没有'Access-Control-Allow-Origin'标头在请求的资源上。
我的servlet使用处理程序工厂,该工厂使正确的处理程序可以处理请求。 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循环放在此处,因此我能够看到我的角度应用程序中的内容如何到达我的处理程序。
在我的角度应用程序的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方法并在那里设置所有标头似乎可以解决问题