标签:
过滤器的作用
1.当用户请求web资源时,如果没有过滤器,用户可以直接获取到这个web资源,当有了过滤器之后,当用户请求web资源时,web容器中的过滤器先会拦截到这个请求,然后根据这个请求 做相应的处理,之后会访问这个请求所对应的资源,这个资源返回给过滤器,再由过滤器返回给用户;过滤器的作用大概就是这样。
接下来讲一下过滤器的生命周期;
首先要实例化这个过滤器,实例化的时间是在web.xml 被加载的时候,之后就是初始化这个过滤器,初始化会调用init()方法,目前这两步都只会执行一次,就是当web容器启动的时候,接下来就是过滤,过滤调用doFilter()方法;之后就是销毁阶段,destory()方法,这个方法也是只调用一次,就是在web容器关闭的时候,
init()这是过滤器的初始化方法,web容器创建过滤器实例后,将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数;
doFilter()这个方法完成实际的过滤操作,这个地方是过滤器的核心方法,当用户请求访问与过滤器相关联的url时,web容器将先调用过滤器的doFilter方法;
FileterChain参数可以调用chain.doFiter方法,将请求传给下一个过滤器(或者目标资源),或者利用转发,重定向将请求转发到其他资源,
destory:web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源
要使用过滤器要在web.xml配置好这个过滤器
在web.xml中配置过滤器,除了用编写代码的形式,还可以用myeclipse中design中的快捷方法;选中filter;
FirstFilter.java
package com import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FirstFilter implements Filter { @Override public void destroy() { System.out.println("destroy---FirstFilter"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("start----doFilter--FirstFilter"); // chain.doFilter(request, response); HttpServletRequest req =(HttpServletRequest) request; HttpServletResponse response2 =(HttpServletResponse) response; //重定向 response2.sendRedirect(req.getContextPath()+"/main.jsp"); //转发 // req.getRequestDispatcher("main.jsp").forward(request, response); // req.getRequestDispatcher("main.jsp").include(request, response); System.out.println("end------doFilter--FirstFilter"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init----FirstFilter"); } }
问题描述:
1.过滤器能否改变用户请求的web资源呢?也就是说能否改变用户请求的路径呢?(可以)
2.过滤器能否直接返回数据呢,能不能直接处理用户请求呢?(不行),过滤器不能直接返回的意思是不能直接处理用户请求,也不能直接对客户端生成响应。response对象是HttpServletResponse,已经是访问的Web资源返回的响应数据。过滤器不是一个标准的Servlet,主要用于对HttpServletRequest进行预处理,也可以对HttpServletResponse进行后处理。
问题:web项目中多个过滤器是如何实现的?多个过滤器对应同一个用户路径执行顺序又是怎么样的?
在web项目中是允许定义多个过滤器的,如果这些过滤器互不相干,就会形成一条过滤器链,那么这个代码是dofiter里的代码是如何执行的呢?
服务器会按照web.xml 中过滤器定义的先后顺序组装成一条链,
SecondFilter.java
package com import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class SecondFilter implements Filter { @Override public void destroy() { System.out.println("destroy-----SecondFilter"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("start---doFilter--SecondFilter"); chain.doFilter(request, response); System.out.println("end---doFilter--SecondFilter"); } @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init-----SecondFilter"); } }
它会依次先执行过滤器链的各个过滤器的放行钱的代码,然后在执行web资源代码,然后再依次倒着执行过滤器链的各个过滤器的放行后的代码,
标签:
原文地址:http://www.cnblogs.com/zht0915/p/4729385.html