过滤器Filter Filter和Lister是Servlet规范里的两个高级特性。不同于Servlet,它们不用于处理客户端请求,只用于对request、response进行修改或者对context、session、request事件进行监听。 Filter意为滤镜或者过滤器,用于Servlet之外对request或者response进行修改。Filter提出了滤镜链的概念,一个Filterchain包括多个F
过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。
当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。
其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。
其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet接口!没错,写过滤器就是写一个类,实现Filter接口。
public class HelloFilter implements Filter {
public void init[崔1] (FilterConfig filterConfig) throws ServletException {}
public void doFilter[崔2] (ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Hello Filter");
}
public void destroy[崔3] () {}
}
[崔1]不去理会它
[崔2]当访问被拦截资源时,doFilter()方法会被调用!我们先不去管它的参数是什么作用!
[崔3]不去理会它
[崔4]指定要拦截的路径!当用户访问index.jsp页面时,HelloFilter就会被执行
第二步也与Servlet一样,在web.xml文件中部署Filter:
<filter>
<filter-name>helloFilter</filter-name>
<filter-class>cn.itcast.filter.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>helloFilter</filter-name>
<url-pattern>/index.jsp[崔4] </url-pattern>
</filter-mapping>
应该没有问题吧,都可以看懂吧!
OK了,现在可以尝试去访问index.jsp页面了,看看是什么效果!
当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的示例中,index.jsp页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行!
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter start...");[崔5]
chain.doFilter(request, response);[崔6]
System.out.println("filter end...");[崔7]
}
[崔5]执行index.jsp之前执行
[崔6]放行!表示执行index.jsp
[崔7]在执行index.jsp后执行这一句
有很多同学总是错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成!
转载于:https://www.cnblogs.com/snowwhite/p/4639375.html
相关资源:过滤器学习笔记一(Filter教你快速入门)