学习Filter

http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html

Filter 介绍:

  它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理。使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给Servlet 进行处理并生成响应,最后Filter 再对服务器响应进行后处理。

  Filter 用处:

  > 在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。

  > 根据需要检查 HttpServletRequest ,也可以修改HttpServletRequest 头和数据。

  > 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。

  > 根据需要检查 HttpServletResponse ,也可以修改HttpServletResponse头和数据。

  

  Filter 种类:

  > 用户授权的 Filter

  > 日志 Filter

  > 负责解码的 Filter

  > Filter 可负责拦截多个请求或响应

创建一个Filter:

  1、创建Filter类

  必须实现javax.servlet.Filter接口,在该接口中定义了如下方法:

  1、void init(FilerConfig config):用于完成Filter的初始化。

  2、void destroy():用于Filter撤销前,完成某些资源的回收。

  3、void doFilter(ServletRequest request,ServletResponse response, FilterChain chain):实现过滤功能,该方法就是对每一个请求及功能增加的额外处理。

  

package jbelial.Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogFilter implements Filter {

    //FilterConfig用于访问Filter的配置信息
    private FilterConfig config ;
    // 实现销毁
    public void destroy() {
        // TODO Auto-generated method stub
        this.config = null ;
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        //-----------------对用户请求执行预处理-----------------------
        ServletContext context = this.config.getServletContext() ;
        long before = System.currentTimeMillis() ;
        System.out.println("开始过滤。。。。");
        //将请求转换成HttpServletRequest 请求。
        HttpServletRequest hrequest = (HttpServletRequest)request ;
        System.out.println("Filter 已经截获到用户的请求的地址:" +
                hrequest.getServletPath());
        // Filter 只是链式处理,请求依然放行到目的地址
        chain.doFilter(request, response) ;
        //---------------对服务器响应执行后处理-----------------------
        long after = System.currentTimeMillis() ;
        System.out.println("过滤结束。。。。");
        System.out.println("请求被定位到"+hrequest.getRequestURI()+
                " 所花时间:"+(after - before));

    }
    // 实现初始化
    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub
        this.config = config ;
    }

}

  实现该方法就可以实现对用户的请求进行预处理,也可以对服务器响应进行后处理——分界线为是否调用了chain.doFilter(request.response) 。

   上面的请求Filter 仅在日志中记录请求的URL,对所有的请求都执行 chain.doFilter(request,response) 方法,当Filter 对请求过滤后依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求 HttpSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可。

  2、配置Filter

   > 配置 Filter 名。

   > 配置 Filter 拦截 URL 模式。

     1、通过Annotation 进行配置

      在Filter 类 中添加:

      @WebFilter(filterName= "log",urlPatterns = {"/*"})

      下面附上@WebFilter 支持的常用属性表

属性 是否必须 说明
asyncSupported F 指定该Filter是否支持异步操作模式。
dispatcherTypes F
指定该Filter仅对dispatchar模式的请求进行过滤。该属性支持ASYNC、ERROR、FORWARD、

INCLUDE、REQUST这5个值的任意组合。默认为同时过滤5种模式的请求。

displayName  F 指定该Filter的显示名  
filterName      指定该Filter的名字
initParams F 用于为该Filter配置参数
servletNames F 该属性值可指定多个Servlet的名称,用于指定该Filter仅对这几个Servlet执行过滤
urlPatterns F 指定该Filter所拦截的URL

     2、在web.xml 文件中配置:

 <filter>
     <filter-name>log</filter-name>
     <filter-class>jbelial.Filter.LogFilter</filter-class>
 </filter>
 <filter-mapping>
     <filter-name>log</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

  

   Filter 的 doFilter()方法里面多了一个FilterChain 的参数,通过该参数可以控制是否放行用户请求。在实际项目中, Filter 里 doFilter() 方法里的代码就是从多个Servlet 的service() 方法里面抽取的通用代码,通过使用Filter 可以实现更好的代码复用。

   如下面的代码:

@WebFilter(filterName="authority"
    , urlPatterns={"/*"}
    , initParams={
        @WebInitParam(name="encoding", value="GBK"),
        @WebInitParam(name="loginPage", value="/login.jsp"),
        @WebInitParam(name="proLogin", value="/proLogin.jsp")})
public class AuthorityFilter implements Filter
{
    //FilterConfig可用于访问Filter的配置信息
    private FilterConfig config;
    //实现初始化方法
    public void init(FilterConfig config)
    {
        this.config = config;
    }
    //实现销毁方法
    public void destroy()
    {
        this.config = null;
    }
    //执行过滤的核心方法
    public void doFilter(ServletRequest request,
        ServletResponse response, FilterChain chain)
        throws IOException,ServletException
    {
        //获取该Filter的配置参数
        String encoding = config.getInitParameter("encoding");
        String loginPage = config.getInitParameter("loginPage");
        String proLogin = config.getInitParameter("proLogin");
        //设置request编码用的字符集
        request.setCharacterEncoding(encoding);
        HttpServletRequest requ = (HttpServletRequest)request;
        HttpSession session = requ.getSession(true);
        //获取客户请求的页面
        String requestPath = requ.getServletPath();
        //如果session范围的user为null,即表明没有登录
        //且用户请求的既不是登录页面,也不是处理登录的页面
        if( session.getAttribute("user") == null
            && !requestPath.endsWith(loginPage)
            && !requestPath.endsWith(proLogin))
        {
            //forward到登录页面
            request.setAttribute("tip" , "您还没有登录");
            request.getRequestDispatcher(loginPage)
                .forward(request, response);
        }
        //"放行"请求
        else
        {
            chain.doFilter(request, response);
        }
    }
}

  如果用户没有登录,那么只能访问/login.jsp和/proLogin.jsp页面。  

  在 web.xml文件中配置该Filter:

 <filter>
     <filter-name>authority</filter-name>
     <filter-class>jbelial.Filter.Authority</filter-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>GBK</param-value>
     </init-param>
          <init-param>
         <param-name>loginPage</param-name>
         <param-value>/login.jsp</param-value>
     </init-param>
          <init-param>
         <param-name>proLogin</param-name>
         <param-value>/proLogin.jsp</param-value>
     </init-param>
 </filter>
 <filter-mapping>
     <filter-name>authority</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>
</web-app>

时间: 2024-08-28 07:04:28

学习Filter的相关文章

Java web学习filter (1)

一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能.二.Filter简介Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filte

Servlet的学习之Filter过滤器技术(1)

本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器,非常简单,只要实现Servlet  API中的Filter接口即可,同时在该web应用[WEB-INF]目录下的web.xml文件中配置<filter>和<filter-mapping>两个标签.其中可以根据配置指定过滤的页面或者Servlet. 也就是说我们在web工程中光光写Fil

filter与servlet的比较

最近在开java的东西,还记得刚开始使用servlet是在调试一个ajax的时候,那时候不知道如何使用,就知道写一个路径去调用,总是提示404错误,以为是相对路径与绝对路径的问题,到最后自己一点点的调通了,知道servlet是需要服务器编译运行,是需要配置web.xml的.到学习filter,发现他们的套路完全是一样的,也需要在web.xml中进行相应的配置.可以说是基本一样的,我不禁要问,他们之间有什么异同呢. 遇到问题的时候也是学习的时候,我就在网上找了点相关的资料,与大家分享一下: 主要从

Centos6.5 iptables的Filter详解

今天一个同学它的腾讯云服务器出现了个小问题,启动tomcat服务器后.在服务器本机上使用curl 127.0.0.1:8080访问没任何问题.但通过外网ip却一直访问不了.然后我Google的一堆解决方法,最多的还是关于防火墙iptables的配置.虽然最后重新装了一个tomcat后就莫名其妙的正常了.根本不是iptables的问题,但通过解决这个问题查询了大量iptables方面的知识(虽然当初啃<鸟哥的Linux私房菜>的时候看过相关知识,但毕竟没有实践,今天正好借这个机会实际了一把),现

AngularJS1.X学习笔记7-过滤器

最近参加笔试被虐成狗了,感觉自己的算法太弱了.但是还是先花点事件将这个AngularJS学习完.今天学习filter 一.内置过滤器 (1)过滤单个数据值 <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>内置过滤器-过滤单个数据值</title> <

JavaWeb——Filter

一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候,就闲话不絮了. Filter称之为过滤器,是用来做一些拦截的任务.比如客户端请求服务器的某个资源时(可以是Servlet.JSP.HTML等等),我们可以拦截.当服务器返回资源给客户端的时候,我们也可以拦截.这样我们就可以在调用资源之前和之后分别加入一些业务逻辑. 当我们对某个资源加上多个过滤器的

filter实例

最近在学习filter,看完理论知识之后,就特地在实际工作中的系统中去验证. SSP系统实例如下: 1.在web.xml中寻找 filter的配置信息 如下: <filter>  <filter-name>passoFilter</filter-name>  <filter-class>com.pingan.passo.wls.client.filter.SSOClientFilter</filter-class> </filter>

7-ng-repeat指令实例以及扩展部分

在前面的文章中学习filter过滤器,现在在结合着看看ng-repeat指令,举个例子. <div ng-controller="Aaa"> <table border="1"> <tr> <th ng-click="fnSort('name')">颜色</th> <th ng-click="fnSort('age')">值</th> <

日志分析工具ELK(四)

Logstash收集TCP日志 #Input plugins TCP插件 所需的配置选项 tcp { port =>... } [[email protected]-node1 ~]# cat tcp.conf input { tcp { host =>"192.168.230.128" port =>"6666" } } output { stdout{ codec =>"rubydebug" } } [[email p