• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Java过滤器Filter的使用详解

技术杂谈 勤劳的小蚂蚁 4个月前 (01-25) 103次浏览 已收录 0个评论 扫描二维码

过滤器



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

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


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

过滤器的简单应用



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

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

3、在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。
<filter>  
   <filter-name>loginFilter</filter-name>//过滤器名称  
   <filter-class>com.nnngu.filter.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>
</filter-mapping>

<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来定义过滤规则。如下:
<filter>
 <filter-name>loginFilter</filter-name>
 <filter-class>com.nnngu.filter.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>

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


publicvoiddoFilter(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”);
       }

}

例2:设置字符编码


publicvoiddoFilter(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);

   }

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Java过滤器Filter的使用详解
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00