我阅读了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
答案 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规范以了解更多信息。