rss· 投稿· 设为首页· 加入收藏· 繁體版

Servlet Filter的顺序问题

Filter是一个很有用的东西(前面已经提到过),使用filter可以修改request, response, session, application中的内容,javax.servlet.Filter的doFilter()的signature是这样的:
public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) 例如, 我们如果想在request中增加一点东西, 可以request.setAttribute("xx","xx");然后需要记住的是一定要记得调用chain.doFilter(request, response); 否则的话,后面的filter和servlet, jsp将不会得到执行。举例详细点就是:
filter1, filter2都在web.xml中定义了,对应的url-mapping都是/*, index.jsp是该应用下的一个jsp, 那么如果直接访问index.jsp的话,那么首先访问的是filter1, 然后是filter2(加入filter1的定义在filter2之前), 最后才是index.jsp。filter1:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
       request.setAttribute("aaa","aaa");
       chain.doFilter(request,response);
       request.setAttribute("bbb","bbb");
}filter2:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException
{
       System.out.println(request.getAttribute("aaa")+"  "+request.getAttribute("bbb"));
       request.setAttribute("ccc","ccc");
       chain.doFilter(request,response);
       request.setAttribute("ddd","ddd");
}index.jsp:
System.out.println(request.getAttribute("aaa")+"  "+request.getAttribute("bbb")+"  "+request.getAttribute("ccc")+"  "+request.getAttribute("ddd"));结论是先作filter1中chain.doFilter()前的部 分,然后是filter2中chain.doFilter()前的部分,然后是jsp,然后是filter2中chain.doFilter()后的代码 部分,然后是filter1中chain.doFilter()后的部分。

顶一下
(0)
踩一下
(0)