【问题标题】:Difference between servlet/servlet-mapping and filter/filter-mapping?servlet/servlet-mapping 和 filter/filter-mapping 之间的区别?
【发布时间】:2011-11-25 06:20:58
【问题描述】:

作为探索/学习 Struts2、JSP 和 Servlet 的一部分,我从 here 和 there 看到 servlets 和 servlets-mapping 可以在 web.xml 中使用。然而,Struts2 也提到了filters 和filter-mapping 为web.xml。

两者有什么区别?这些是相互排斥的吗?我什么时候应该使用 which 以及为什么?有人可以澄清这些概念吗?谢谢。

澄清

我刚刚明白我需要了解 Struts2 和 Servlet 之间的关系:http://www.coderanch.com/t/57899/Struts/Difference-between-servlet-struts

【问题讨论】:

标签: java servlets struts2 mapping servlet-filters


【解决方案1】:

过滤器的使用类似于 Servlet 过滤器。例如,如果您需要对某些 ​​URL 进行安全检查,则可以为这些页面添加过滤器。例如,您可以说/secure/pages/*.do 需要被securityFilter 拦截。然后SecurityFilter类(一个实现Filter接口的类)的doFilter()方法会在转发给实际请求的servlet之前处理安全审计。

Servlet 几乎是标准的东西。您定义一个 servlet,然后让 servlet 容器知道需要将哪种类型的请求映射到该 servlet。

它们不是相互排斥的。它们都可以同时使用。将过滤器想象成这个词的意思——它在进行下一个 servlet/操作之前“过滤”事物(日志记录、安全性等)。

【讨论】:

    【解决方案2】:

    Servlet 过滤器实现intercepting filter 模式。虽然 servlet 是 Web 请求的最终目标,但每个请求都会经过一系列过滤器。每个过滤器都可以在进一步传递请求之前修改请求,或者在从 servlet 接收回请求后进行响应。它甚至可以避免进一步传递请求并像 servlet 一样完全处理它(并不少见)。例如缓存过滤器可以在不调用实际 servlet 的情况下返回结果。

    【讨论】:

      【解决方案3】:

      根据 servlet 规范的请求生命周期在最终被 servlet 执行之前会经过一系列过滤器。

      当您查看Filter 接口中 doFilter 方法的签名时,这相当直观

      doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      

      也就是说,在过滤器中,您可以访问请求和响应以及链。合同规定,作为实施者,您应该在您在过滤器中执行的操作之前或之后调用chain,如果不希望继续执行,则根本不调用。调用chain.doFilter(...) 将导致过滤器链中的下一个过滤器与请求的URL 匹配的映射被执行。链的最后一个成员是映射与请求的 URL 匹配的 servlet。

      从技术上讲,您可以在过滤器中完成所有可以在 servlet 中完成的操作。您可以构建您的应用程序以在过滤器中执行所有处理和呈现,并拥有一个什么都不做的空白 servlet。主要区别在于,如果没有映射到给定 URL 的 servlet,则容器必须以 404 错误响应,因此必须始终有一个映射到您要服务的任何 URL 的 servlet。您也可以只将一个 servlet 映射到一个 URL,但您可以有任意数量的过滤器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 2014-01-04
        • 2011-04-11
        • 2011-05-27
        • 2012-08-22
        • 2014-05-27
        • 1970-01-01
        相关资源
        最近更新 更多