filter 执行顺序

baoding 贡献于2012-06-01

作者 黃 寶定  创建于2012-06-01 07:35:00   修改者黃 寶定  修改于2012-06-01 07:35:00字数4438

文档摘要: 因为Filter本来设计成为多种协议服务,http协议仅仅是其中一部分。不过我们接触到的也只有http,而且也只有转换成对应HttpServletRequest和HttpServletResponse才能进行下面的session操作和页面重定向。得到了http请求之后,可以获得请求对应的session,判断session中的username变量是否为null,如果不为null,说明用户已经登录,就可以调用doFilter继续请求访问的资源。如果为null,说明用户还没有登录,禁止用户访问,并使用页面重定向跳转到failure.jsp页面显示提示信息。
关键词:

多个filter的执行顺序【转】 package anni; public class EncodingFilter implements Filter {     public void init(FilterConfig config) throws ServletException {}     public void destroy() {}     public void doFilter(ServletRequest request,             ServletResponse response,             FilterChain chain)             throws IOException, ServletException {         request.setCharacterEncoding("gb2312");         chain.doFilter(request, response);     } } web.xml中     EncodingFilter     anni.EncodingFilter     EncodingFilter     /* filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的/*表示所有请求,/表示根 路径,*(星号)代表所有请求,加在一起就变成了根路径下的所有请求。这样,所有的请求都会先被EncodingFilter拦截,并在请求里设置上指定 的gb2312编码。 ================================ 用filter控制用户访问权限 我们要保护的页面是admin/index.jsp,为此我们在web.xml进行如下配置。     SecurityFilter     anni.SecurityFilter     SecurityFilter     /admin/* SecurityFilter过滤器: public void doFilter(ServletRequest request,         ServletResponse response,         FilterChain chain)         throws IOException, ServletException {     HttpServletRequest req = (HttpServletRequest) request;     HttpServletResponse res = (HttpServletResponse) response;    HttpSession session = req.getSession();     if (session.getAttribute("username") != null) {         chain.doFilter(request, response);     } else {         res.sendRedirect("../failure.jsp");     } } 首先要将ServletRequest和ServletResponse转换成HttpServletRequest和 HttpServletResponse,因为Filter本来设计成为多种协议服务,http协议仅仅是其中一部分。不过我们接触到的也只有http, 而且也只有转换成对应HttpServletRequest和HttpServletResponse才能进行下面的session操作和页面重定向。 得到了http请求之后,可以获得请求对应的session,判断session中的username变量是否为null,如果不为null,说明用户已 经登录,就可以调用doFilter继续请求访问的资源。如果为null,说明用户还没有登录,禁止用户访问,并使用页面重定向跳转到 failure.jsp页面显示提示信息。 ================================== filter所谓的特性 请求映射 filter-mapping和servlet-mapping都是将对应的filter或servlet映射到某个url-pattern上,当客户发 起某一请求时,服务器先将此请求与web.xml中定义的所有url-pattern进行匹配,然后执行匹配通过的filter和servlet。 你可以使用三种方式定义url-pattern。 1.直接映射一个请求。     ContactServlet     /contact.do                     2.映射一个路径下的所有请求。     EncodingFilter     /* 3.映射结尾相同的一类请求。     ControllerServlet     *.do 想要获得所有以user开头.do结尾的请求吗?user*.do在url-pattern是无法识别的,只能配置成*.do,再去servlet中对请求进行筛选。 想要让一个servlet负责多个请求吗?/user/*,/admin/*,*.do写在一起url-pattern也不认识,只能配成多个servlet-mapping。     ControllerServlet     /user/*     ControllerServlet     /admin/*     ControllerServlet     *.do 过滤链 服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如上图所示,执行第一 个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的 chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。 过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。 filter的详细配置 在servlet-2.3中,Filter会过滤一切请求,包括服务器内部使用forward转发请求和<%@ include file="/index.jsp"%>的情况。 到了servlet-2.4中Filter默认下只拦截外部提交的请求,forward和include这些内部转发都不会被过滤,但是有时候我们需要forward的时候也用到Filter,这样就需要如下配置。     TestFilter     anni.TestFilter     TestFilter     /*     REQUEST     FORWARD     INCLUDE     EXCEPTION         这样TestFilter就会过滤所有状态下的请求。 如果我们没有进行设置,默认使用的就是REQUEST。而EXCEPTION是在isErrorPage="true"的情况下出现的,这个用处不多,看一下即可。 这里FORWARD是解决request.getDispatcher("index.jsp").forward(request, response);无法触发Filter的关键,配置上这个以后再进行forward的时候就可以触发过滤器了。 Filter还有一个有趣的用法,在filter-mapping中我们可以直接指定servlet-mapping,让过滤器只处理一个定义在web.xml中的servlet。     TestFilter     TestServlet     TestServlet     anni.TestServlet     TestServlet     /TestServlet        直接指定servlet-name,TestFilter便会引用TestServlet配置的url-pattern,在某些filter与servlet绑定的情况下不失为一个好办法。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档