转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html

 在我的项目中有具体应用:https://github.com/ygj0930/CoupleSpace

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

过滤器

   过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

Java过滤器Filter使用详解 随笔 第1张

 

 

      如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

     在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

     Java过滤器Filter使用详解 随笔 第2张

     过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

     下面是过滤器的简单应用:

    1:创建过滤器

    Java过滤器Filter使用详解 随笔 第3张

    如图,新建一个class,实现接口Filter(注意:是javax.servlet中的Filter)。

    2:重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。在doFilter方法中进行过滤操作。

    常用代码有:获取请求、获取响应、获取session、放行。

    剩下的代码就是根据session的属性进行过滤操作、设置编码格式等等了,看情况而定。

Java过滤器Filter使用详解 随笔 第4张
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象
HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象
HttpSession session=request.getSession();//获取session对象

过滤操作代码......

chain.doFilter(request, response);//放行,通过了当前过滤器,递交给下一个filter进行过滤
Java过滤器Filter使用详解 随笔 第5张

    3:在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

Java过滤器Filter使用详解 随笔 第6张
<filter>  
    <filter-name>loginFilter</filter-name>//过滤器名称  
    <filter-class>com.ygj.control.loginFilter</filter-class>//过滤器类的包路径
<init—param> //可选 
    <param—name>参数名</param-name>//过滤器初始化参数
    <param-value>参数值</param-value>  
</init—pamm>  
</filter> 
<filter-mapping>//过滤器映射 <filter-name>loginFilter</filter-name> <url—pattern>指定过滤器作用的对象</url-pattern>
Java过滤器Filter使用详解 随笔 第7张

    在配置中需要注意的有两处:一是<filter-class>指明过滤器类所在的包路径。二是<url-pattren>处定义过滤器作用的对象。一般有以下规则:

    1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

    2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

    3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

    4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

    如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

Java过滤器Filter使用详解 随笔 第8张
   <filter>
      <filter-name>loginFilter</filter-name>
      <filter-class>com.ygj.control.loginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.do</url-pattern>
  </filter-mapping>
Java过滤器Filter使用详解 随笔 第9张

    例1:用过滤器实现登录验证,没登录则驳回访问请求并重定向到登录页面。

Java过滤器Filter使用详解 随笔 第10张
public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        
        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        HttpSession session=request.getSession();
        
        String path=request.getRequestURI();
        
        Integer uid=(Integer)session.getAttribute("userid");
        
        if(path.indexOf("/login.jsp")>-1){//登录页面不过滤
            arg2.doFilter(arg0, arg1);//递交给下一个过滤器
            return;
        }
        if(path.indexOf("/register.jsp")>-1){//注册页面不过滤
            arg2.doFilter(request, response);
            return;
        }
        
        if(uid!=null){//已经登录
            arg2.doFilter(request, response);//放行,递交给下一个过滤器
            
        }else{
            response.sendRedirect("login.jsp");
        }

    }
Java过滤器Filter使用详解 随笔 第11张

     例2:设置字符编码

Java过滤器Filter使用详解 随笔 第12张
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
          HttpServletRequest request2=(HttpServletRequest) request;
          HttpServletResponse response2=(HttpServletResponse) response;
          
          request2.setCharacterEncoding("UTF-8");  
          response2.setCharacterEncoding("UTF-8"); 
          
          chain.doFilter(request, response); 

    }
Java过滤器Filter使用详解 随笔 第13张

 

分类: C9 开发笔记 标签: Java, 过滤器, Filter 好文要顶 关注我 收藏该文 Java过滤器Filter使用详解 随笔 第14张 Java过滤器Filter使用详解 随笔 第15张 Java过滤器Filter使用详解 随笔 第16张 .长卿
关注 - 3
粉丝 - 276 +加关注 4 1 « 上一篇: J4架构应用过程中出现的问题与解决摘录
» 下一篇: Java监听器Listener使用详解
posted @ 2017-02-07 15:10 .长卿 阅读( 77630) 评论( 4) 编辑 收藏
评论列表    回复引用 #1楼 2018-02-13 12:15 一清   不错 支持(0) 反对(0) http://pic.cnblogs.com/face/1312707/20180713142841.png    回复引用 #2楼 2018-07-29 14:50 iTarget   说得挺清晰的,不错。 支持(0) 反对(0)    回复引用 #3楼 2018-09-06 09:57 当初的当初   谢谢你 支持(0) 反对(0) http://pic.cnblogs.com/face/1454236/20190313143852.png    回复引用 #4楼 4138794 2018/12/13 23:21:33 2018-12-13 23:21 MaoHee   在web.xml中定义Filter或Servlet的顺序并无先后,只是服务器在加载的时候按:监听器>过滤器>Servlet的顺序加载的而已。 支持(4) 反对(0) 刷新评论 刷新页面 返回顶部 发表评论

昵称:

评论内容: Java过滤器Filter使用详解 随笔 第17张 Java过滤器Filter使用详解 随笔 第18张 Java过滤器Filter使用详解 随笔 第19张 Java过滤器Filter使用详解 随笔 第20张 Java过滤器Filter使用详解 随笔 第21张 Java过滤器Filter使用详解 随笔 第22张

不改了 退出 订阅评论

[Ctrl+Enter快捷键提交]

【推荐】超50万C++/C#源码: 大型实时仿真组态图形源码
【活动】看雪2019安全开发者峰会,共话安全领域焦点
【培训】Java程序员年薪40W,他1年走了别人5年的路
最新新闻
· 日本显示器公司连续第五年亏损 宣布裁员1000人
· 深网|万达百货更名苏宁易购广场 改造店5月底亮相
· 圈重点!腾讯全球数字生态大会带来不一样的智慧医疗
· 3岁娃成“社交万人迷”?别再被天价“情商培训班”忽悠了
· 国产手机十年厮杀过后,为何只剩下华为带着米OV?
» 更多新闻...,

 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html

 在我的项目中有具体应用:https://github.com/ygj0930/CoupleSpace

过滤器

   过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

Java过滤器Filter使用详解 随笔 第23张

 

 

      如图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤。过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

     在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。过滤链代码的执行顺序如下:

     Java过滤器Filter使用详解 随笔 第24张

     过滤器一般用于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用,不必每个servlet中还要进行相应的操作。

     下面是过滤器的简单应用:

    1:创建过滤器

    Java过滤器Filter使用详解 随笔 第25张

    如图,新建一个class,实现接口Filter(注意:是javax.servlet中的Filter)。

    2:重写过滤器的doFilter(request,response,chain)方法。另外两个init()、destroy()方法一般不需要重写。在doFilter方法中进行过滤操作。

    常用代码有:获取请求、获取响应、获取session、放行。

    剩下的代码就是根据session的属性进行过滤操作、设置编码格式等等了,看情况而定。

Java过滤器Filter使用详解 随笔 第26张
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象
HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象
HttpSession session=request.getSession();//获取session对象

过滤操作代码......

chain.doFilter(request, response);//放行,通过了当前过滤器,递交给下一个filter进行过滤
Java过滤器Filter使用详解 随笔 第27张

    3:在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

Java过滤器Filter使用详解 随笔 第28张
<filter>  
    <filter-name>loginFilter</filter-name>//过滤器名称  
    <filter-class>com.ygj.control.loginFilter</filter-class>//过滤器类的包路径
<init—param> //可选 
    <param—name>参数名</param-name>//过滤器初始化参数
    <param-value>参数值</param-value>  
</init—pamm>  
</filter> 
<filter-mapping>//过滤器映射 <filter-name>loginFilter</filter-name> <url—pattern>指定过滤器作用的对象</url-pattern>
Java过滤器Filter使用详解 随笔 第29张

    在配置中需要注意的有两处:一是<filter-class>指明过滤器类所在的包路径。二是<url-pattren>处定义过滤器作用的对象。一般有以下规则:

    1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

    2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

    3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

    4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

    如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

Java过滤器Filter使用详解 随笔 第30张
   <filter>
      <filter-name>loginFilter</filter-name>
      <filter-class>com.ygj.control.loginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.do</url-pattern>
  </filter-mapping>
Java过滤器Filter使用详解 随笔 第31张

    例1:用过滤器实现登录验证,没登录则驳回访问请求并重定向到登录页面。

Java过滤器Filter使用详解 随笔 第32张
public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        
        HttpServletRequest request=(HttpServletRequest) arg0;
        HttpServletResponse response=(HttpServletResponse) arg1;
        HttpSession session=request.getSession();
        
        String path=request.getRequestURI();
        
        Integer uid=(Integer)session.getAttribute("userid");
        
        if(path.indexOf("/login.jsp")>-1){//登录页面不过滤
            arg2.doFilter(arg0, arg1);//递交给下一个过滤器
            return;
        }
        if(path.indexOf("/register.jsp")>-1){//注册页面不过滤
            arg2.doFilter(request, response);
            return;
        }
        
        if(uid!=null){//已经登录
            arg2.doFilter(request, response);//放行,递交给下一个过滤器
            
        }else{
            response.sendRedirect("login.jsp");
        }

    }
Java过滤器Filter使用详解 随笔 第33张

     例2:设置字符编码

Java过滤器Filter使用详解 随笔 第34张
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
          HttpServletRequest request2=(HttpServletRequest) request;
          HttpServletResponse response2=(HttpServletResponse) response;
          
          request2.setCharacterEncoding("UTF-8");  
          response2.setCharacterEncoding("UTF-8"); 
          
          chain.doFilter(request, response); 

    }
Java过滤器Filter使用详解 随笔 第35张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄