java - 如何处理从 servlet 中的 Angular 应用程序发送的预检请求?

标签 java angular servlets cors

我正在 Angular 中创建一个项目,该项目从在 localhost:8080 上运行的 tomcat 应用程序获取用户的 json。现在我正在尝试使用 http.put 更新用户。当我发送 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 方法并在那里设置所有 header ,似乎解决了问题

关于java - 如何处理从 servlet 中的 Angular 应用程序发送的预检请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61932433/

相关文章:

java - 在 Android 中解析 double 时出错

java - Struts 1.3.10 Digester.getParser() UnsupportedOperationException

Angular 2 + ngrx/商店 : one-way binding to an &lt;input&gt;

java - 是否可以将javascript值分配给html并使用Jsp获取该值?

java - 如何使用在 Tomcat 服务器中运行的 JavaEE 应用程序从文件夹中检索图像?

java - 我什么时候应该使用哈希而不是类

java - 将物体从墙上弹起

Angular2 编译到 bin 路径?

带有语义 UI 的 Angular *NgIf

javascript - 通过两种不同的方法将数据从 HTML 发送到 Servlet