过滤器

来源:互联网 发布:淘宝字体颜色代码 编辑:程序博客网 时间:2024/05/10 23:28

过滤器工作原理

当客户端发出web资源的请求时,web服务器根据应用程序配置文件设置的过滤器进行检查,客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求或请求数据进行检查或者改动,丙依次通过过滤器链,最后把请求/响应交给请求的web资源处理。请求信息在过滤器中可以被修改,也可以发挥一个响应,当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回,同样在这个过程中,用户可以修改响应信息,从而完成一系列的任务。

1、实现过滤器需要实现Filter借口,并且实现其中的init和doFilter方法。
public class UserFilter extends HttpServlet implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig)
throws ServletException{
this.filterConfig=filterConfig;
}
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)
throws ServletException,IOException{
HttpSession session=((HttpServletRequest)
request).getSession();
if(session.getAttribute(“user”)= =null){
PrintWriter out=response.getWriter();
out.print(“<script language=javascript>alert(‘您还没登录 , 请登录!!’);javascript:location=’系统登录的主页面 ';</script>");
out.flush();
out.close();
}
else{
chain.doFilter(request, response);
}
}
}
在 web.xml 中配置 Servlet 过滤器
<filter>
<filter-name>UserLoginFilter</filter-name>
<filter-class>hzu. util.filters.UserFilter</
filter-class>
</filter>
<filter-mapping>
<filter-name>UserLoginFilter</filter-name>
<url-pattern>[/ 目录名 ]/*</url-pattern>
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
</filter-mapping>
映射 Filter的<dispatcher> 子元素可以设置的值及其意义REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE: 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调 用。FORWARD: 如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR: 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。如果不进行配置,默认是只过滤REQUEST。
过滤器链


首先执行过滤器0的doFilter()方法调用chain.doFilter()语句前的代码,接着执行过滤器1的doFilter()方法调用chain.doFilter()语句前的代码,以此类推,最后执行过滤器n的doFilter()方法调用chain.doFilter()语句前的代码。响应的过程中,首先返回的执行过滤器n的doFilter()方法调用chain.doFilter()语句前的代码,一次类推,最后执行过滤器0的doFilter()方法调用chain.doFilter()语句前的代码。


过滤器链的配置
和一般过滤器配置没有什么不同,将多个过滤器配置在web.xml文件中即可,执行顺序是从上到下一次执行(根据<filter-mapping>标签的顺序)

 

原创粉丝点击