【问题标题】:When would javax.servlet.Filter.doFilter(ServletRequest req, ServletResponse res) be called with anything other than HttpServletRequest/Response?javax.servlet.Filter.doFilter(ServletRequest req, ServletResponse res) 什么时候可以用 HttpServletRequest/Response 以外的任何东西调用?
【发布时间】:2012-09-10 10:44:59
【问题描述】:

多年来我一直在编写 servlet 和过滤器,这一直让我有点恼火 - 将 ServletRequest 和 ServletResponse 参数检查和强制转换为 HttpServletRequest 和 HttpServletResponse,尤其是过滤器因为没有标准的 HttpFilter 基类可以为您执行此操作 - 与 servlet 不同。

问题是 - 你什么时候会看到除了 HttpServletRequest/HttpServletResponse 被传递给你的 servlet/filter 之外的任何东西,如果你这样做了你应该怎么做?

【问题讨论】:

  • JSF 实用程序库 OmniFaces 有一个 HttpFilter。

标签: java servlets


【解决方案1】:

在一些尚未实现的世界中,除了 HttpServlets 之外还有其他 servlet 类型。

【讨论】:

  • 字。有人称之为“我们有一天可能需要它”的架构方法。或者他们在丰田所说的“浪费”。
  • 感谢您 - 我已经根据 HttpServlet 的功能创建了自己的 HttpFilter 类,我只会担心当有人为 Web 发明新协议时更改它。
  • @pauli 它不必采用新协议。例如,您可以想象一个 FTPServlet。
  • @EJP 你当然是对的。只要我在 Tomcat 或 Jetty 中运行,它就只会是 http。如果我有一个支持 FTP 的 servlet 容器,那么我可以获得 FTPServletRequest/Response。
【解决方案2】:

根据我通过 API 的理解,servlet 规范是专门为 HTTP/web 使用而创建的 servlet 框架。

servlet 规范参考部分中提到的协议都只与 HTTP 有关。
RFC 1945 超文本传输​​协议 (HTTP/1.0)
RFC 2616 超文本传输​​协议 (HTTP/1.1)
RFC 2617 HTTP 身份验证:基本和摘要式身份验证
RFC 2324 超文本咖啡壶控制协议 (HTCPCP/1.0) -- 这是基于 HTTP

所有这些都是 HTTP 协议。

规范也要求这样做:

所有 servlet 容器都必须支持 HTTP 作为请求和响应协议,但可能 还支持其他基于请求/响应的协议,例如 HTTPS(HTTP over SSL)。

而拥有 GenericServlet -> HttpServlet 的原因是在 API 的 API 结构中具有泛化 -> 向专业化类型的层次结构。

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多