了解servlet-api中的请求对象。它是单身人士吗?

时间:2015-11-27 12:30:29

标签: java servlets

我阅读了servlet-3.0规范,并且有一个关于ServletRequest对象的问题。 Currenctly我有一个过滤链

public class MyFilter implements Filter{

    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain filterChain) throws IOException, ServletException {
         //do filter
    }
}
在对javax.servlet.Servlet

进行过滤后

public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException;

发挥作用。过滤器的方法和service方法都在相同的对象引用上运行,这是否可靠? servlet规范说:

  

每个请求对象仅在servlet的范围内有效   服务方法,或在过滤器的doFilter范围内   方法,除非为其启用了异步处理   组件和startA同步方法在请求对象

上调用

但是对我来说并不明显ServletRequest对象是每个请求处理的单例。

更新 :更具体地说,我需要在HttpSession的{​​{1}}方法中返回Filter个实例, doFilter的{​​{1}}方法。总是一样的吗?我的意思是Servlet

2 个答案:

答案 0 :(得分:1)

容器对给定请求使用单个请求对象。但是,任何过滤器都可以包装请求对象,因此您的过滤器或servlet可能会获取包装器,具体取决于其他过滤器的操作。通常作为应用程序开发人员,您会知道是否是这种情况。如果没有使用包装器,则filter和servlet将获得相同的请求对象。

有关请求包装器的信息,请参阅: http://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequestWrapper.html

因此,当您调用getSession()时,您可能会获得方法的容器实现或包装器提供的容器实现。但是请注意,HttpServletRequestWrapper对象提供了一个getRequest()方法,该方法返回它包装的请求对象,这样您就可以通过包装器进行递归,直到获得原始对象然后再调用它为止。很多例子如何在网上做到这一点。

答案 1 :(得分:0)

ServletRequest是一个接口,在doFilter方法和service方法中使用相同的接口。所以两者都将返回相同的会话对象(如果你调用getSession())。

Servlet以及Filter使用相同的接口,因此它的行为方式相同。我不知道为什么你很想知道它是不是单身人士?您可以查看servlet规范以了解更多信息。