【问题标题】:Handling PATCH requests with javax.servlet.http.HttpServlet?使用 javax.servlet.http.HttpServlet 处理 PATCH 请求?
【发布时间】:2017-12-05 16:35:40
【问题描述】:

我们在 Spring Web 应用程序中使用 javax.servlet.http.HttpServlet 类的实现作为错误页面(在 web.xml 中定义),以过滤错误信息,发送给我们 API 的用户以确保安全原因。

最近,我们还必须处理对 API 的 PATCH 请求。由于 HttpServlet 是使用 HTTP 1.1 版实现的,因此它不支持 PATCH 请求(“PATCH”字符串作为请求方法名称)。如果我们要添加功能,我们必须覆盖整个 HttpServlet 实现,这对我们也有负面的安全含义。

是否有开箱即用的方式来实现我们正在尝试的目标,或者我们是否必须切换到另一个实现(也可行)?

【问题讨论】:

  • 能否升级到支持 PATCH 的 HTTP 版本?如果不是,那么实现自己是唯一的选择,即使您使用的是 3rd 方库。
  • 如果您的服务器在 Allow 或 Access-Control-Allow-Methods 标头中不包含 PATCH,则客户端不应发送 PATCH。
  • 它确实包含 PATCH 并且客户端应该发送它。我们为 servlet 使用默认的 java 库,它是为 HTTP 1.1 实现的

标签: java spring servlets


【解决方案1】:

尝试覆盖HttpServlet.service 方法。 对于“DELETE”、“GET”、“HEAD”、“OPTIONS”、“POST”、“PUT”和“TRACE”,将请求传递给服务的super 实现。

对于“PATCH”,调用您在覆盖类中定义的 doPatch 方法。

在实际类中实现doPatch

有关邮件正文的更多信息:
签出 HTTP 引用以查看哪些方法支持方法主体,哪些不支持。 HTTP Wikipedia Page上有一张不错的桌子

【讨论】:

  • 我们使用了类似的东西。由于对所有 HTTP 方法的处理都是相同的,我们只扩展了 service() 方法。谢谢你的回答。
  • 我试过这样做,但似乎请求参数没有通过这种方式...
  • 它们似乎需要在 URL 中传递,而不是作为正文参数(jQuery Ajax 中的“数据”节点)。
【解决方案2】:
public class CustomServlet extends HttpServlet{

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String method = req.getMethod();
            long lastModified;
            if (!method.equals("PATCH")) {
                super.service(req, resp);
            }
    
            this.doPatch(req, resp);
        }

 protected void doPatch(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("At patch method");
    }

}

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2022-01-11
    • 1970-01-01
    • 2017-01-23
    • 2015-06-09
    相关资源
    最近更新 更多