Servlet WEB过滤器

WEB应用中的过滤器截取从客户端进来的请求,并做出处理的回答。它可以说是外部进入 网站的第一道关。在这个头目里,可以验证客户是否来自枳的网络,可以对客户提交的数据进行 重新编码,可以系统里获得配置的信息,可以过滤掉客户的某些不应出现的语汇,可以验证客户是否已经 登录,可以验证客户端的浏览器是否支持当前应用 ,可以记录系统日志等。
可以为一个WEB应用组件 部署多个过滤器,这过滤器组成一个过滤链,每个过滤器只执行某个特定的操作或者检查。这样请求在达到被访问的目标之前,需要经过这个过滤链。如果由于安全的问题不能访问目标资源,那么过滤器就可以 把客户端的请求拦截。

Filter的开发
在应用开发中,我们经常使用的过滤功能就是对客户端的请求进行统一编码,对客户端进行认证,。下面我们做个例子,假设客户端要访问一个secutiry/index.jsp页面。这个页面 接收一些参数 ,这些参数 需要保存到数据库中,为了在数据库中使用相同的编码 ,可以开发一个过滤器对请求进行 统一编码 。secutiry目录下的所有页面 都是受限制的页面 ,只有通过授权 的用户才让访问,如果按照平常的方式,在每个页面 都对用户进行 授权 , 这样不权编程困难,而且代码 的修改也很困难 ,这里来开发一个进行 安全的检查过滤器。
None.gif package  eflylab;
None.gif
None.gif
import  javax.servlet.FilterChain;
None.gif
import  javax.servlet.ServletRequest;
None.gif
import  javax.servlet.ServletResponse;
None.gif
import  java.io.IOException;
None.gif
import  javax.servlet.Filter;
None.gif
import  javax.servlet.http.HttpServletRequest;
None.gif
import  javax.servlet.http.HttpServletResponse;
None.gif
import  javax.servlet.ServletException;
None.gif
import  javax.servlet.FilterConfig;
ExpandedBlockStart.gifContractedBlock.gif
/** */ /**
InBlock.gif * 要开发一个Filter,必须直接或间接实现Filter接口。
InBlock.gif * 
@author Administrator
InBlock.gif *
ExpandedBlockEnd.gif 
*/

None.gif
public   class  EncodingFilter  implements  Filter
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
protected FilterConfig filterConfig;
InBlock.gif    
private String targetEncoding = "gb2312";
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif     *初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。
ExpandedSubBlockEnd.gif     
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void init(FilterConfig config) throws ServletException dot.gif{
InBlock.gif        
this.filterConfig = config;
InBlock.gif        
this.targetEncoding = config.getInitParameter("encoding");//获取FilterConfig中的参数
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/** *//**
InBlock.gif      *进行过滤处理,这个方法最重要,所有过滤处理的代码都在此实现。
ExpandedSubBlockEnd.gif      
*/

InBlock.gif     
public  void doFilter(ServletRequest srequest, ServletResponse  sresponse, FilterChain chain)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
throws IOException, ServletException dot.gif{
InBlock.gif         System.out.println(
"使用以下方法对请求进行编码:encoding="+targetEncoding);
InBlock.gif            
InBlock.gif        HttpServletRequest request 
= (HttpServletRequest)srequest;
InBlock.gif        request.setCharacterEncoding(targetEncoding);
InBlock.gif        
// 把处理权发送到下一个
InBlock.gif
       chain.doFilter(srequest,sresponse);  
ExpandedSubBlockEnd.gif    }
   
InBlock.gif
InBlock.gif    
public void setFilterConfig(final FilterConfig filterConfig)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.filterConfig=filterConfig;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
//销毁过滤器
InBlock.gif
    public void destroy()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.filterConfig=null;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif

Servlet常用接口中知道doFilter是过滤器中最重要的方法,通过这个方法 进行 实际的业务处理,在foFilter方法中,首先获得HTTP的请求和响应对象,然后对HTTP的请求和响应对象,然后 对HTTP请求中的参数 进行 统一编码,这里采用的编码 方式是GB2312。进行 编码 后,就把控制权转让给下一个过滤器。如果在这个过滤链中没有下一个过滤器,那么 就会把请求直接发送到目标 。
配置
Filter描述
None.gif < filter >
None.gif        
< filter-name > encoding </ filter-name >  
None.gif        
< filter-class > eflylab.EncodingFilter </ filter-class >
None.gif        
< init-param >
None.gif                
< param-name > encoding </ param-name >
None.gif                
< param-value > gb2312 </ param-value >
None.gif        
</ init-param >
None.gif
</ filter >

下面我们来看一另一个Filter的开发,这个就是前面说到的用于对用户的访问认证。如果认证通过,那么 允许访问 指定资源,否则不行。
None.gif package  eflylab;
None.gif
None.gif
import  javax.servlet.FilterChain;
None.gif
import  javax.servlet.ServletRequest;
None.gif
import  javax.servlet.ServletResponse;
None.gif
import  java.io.IOException;
None.gif
import  javax.servlet.Filter;
None.gif
import  javax.servlet.http.HttpServletRequest;
None.gif
import  javax.servlet.http.HttpServletResponse;
None.gif
import  javax.servlet.ServletException;
None.gif
import  javax.servlet.FilterConfig;
None.gif
import  javax.servlet.http.HttpSession;
None.gif
None.gif
public   class  SignonFilter  implements  Filter
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    String LOGIN_PAGE
="login_signon.jsp";
InBlock.gif    
protected FilterConfig filterConfig;
InBlock.gif    
InBlock.gif    
//过滤处理的方法
InBlock.gif
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif         HttpServletRequest hreq 
= (HttpServletRequest)req;
InBlock.gif         HttpServletResponse hres 
= (HttpServletResponse)res;
InBlock.gif         HttpSession session 
= hreq.getSession();
InBlock.gif         String isLogin
="";
InBlock.gif         
try
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{
InBlock.gif             isLogin
=(String)session.getAttribute("isLogin");        
InBlock.gif         
InBlock.gif             
if(isLogin.equals("true"))
ExpandedSubBlockStart.gifContractedSubBlock.gif             
dot.gif{
InBlock.gif                 System.out.println(
"在SignonFilter中验证通过");
InBlock.gif                 
//验证成功,继续处理
InBlock.gif
                 chain.doFilter(req,res);
ExpandedSubBlockEnd.gif             }

InBlock.gif             
else
ExpandedSubBlockStart.gifContractedSubBlock.gif             
dot.gif{
InBlock.gif                 
//验证不成功,让用户登录。
InBlock.gif
                 hres.sendRedirect(LOGIN_PAGE);                  
InBlock.gif                 System.out.println(
"被SignonFilter拦截一个未认证的请求");
ExpandedSubBlockEnd.gif             }

ExpandedSubBlockEnd.gif         }

InBlock.gif         
catch(Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif         
dot.gif{         
InBlock.gif             e.printStackTrace();
ExpandedSubBlockEnd.gif         }

InBlock.gif             
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
public void setFilterConfig(final FilterConfig filterConfig)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.filterConfig=filterConfig;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
//销毁过滤器
InBlock.gif
    public void destroy()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
this.filterConfig=null;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockStart.gifContractedSubBlock.gif     
/** *//**
InBlock.gif     *初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。
ExpandedSubBlockEnd.gif     
*/

ExpandedSubBlockStart.gifContractedSubBlock.gif    
public void init(FilterConfig config) throws ServletException dot.gif{
InBlock.gif        
this.filterConfig = config;       
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedBlockEnd.gif}

None.gif

在上面的代码中,首先通过isLogin = (String)session.getAttribute("isLogin")获得用户是否登录 的属性。如果 为 真,则可以访问到目标 资源,否则 转向 login_singnon.jsp
配置
None.gif <? xml version="1.0" encoding="UTF-8" ?>
None.gif
< web-app  version ="2.4"  
None.gif    xmlns
="http://java.sun.com/xml/ns/j2ee"  
None.gif    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
None.gif    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
None.gif    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
None.gif
None.gif
< listener >
None.gif    
< listener-class > eflylab.SessionListener </ listener-class >
None.gif
</ listener >
None.gif
None.gif   
< filter >
None.gif        
< filter-name > encoding </ filter-name >  
None.gif        
< filter-class > eflylab.EncodingFilter </ filter-class >
None.gif        
< init-param >
None.gif                
< param-name > encoding </ param-name >
None.gif                
< param-value > gb2312 </ param-value >
None.gif        
</ init-param >
None.gif    
</ filter >
None.gif    
< filter >
None.gif     
< filter-name > auth </ filter-name >  
None.gif           
< filter-class > eflylab.SignonFilter </ filter-class >  
None.gif    
</ filter >
None.gif    
None.gif    
< filter-mapping >  
None.gif       
< filter-name > encoding </ filter-name >  
None.gif       
< url-pattern > /* </ url-pattern >   
None.gif     
</ filter-mapping > <!--  表示对于encoding  任何请求都会进行 该 过滤  -->
None.gif     
None.gif    
< filter-mapping >  
None.gif       
< filter-name > auth </ filter-name >  
None.gif       
< url-pattern > /security/* </ url-pattern >   
None.gif   
</ filter-mapping >      
None.gif    
< filter-mapping >  
None.gif       
< filter-name > auth </ filter-name >  
None.gif       
< url-pattern > /admin/* </ url-pattern >   
None.gif   
</ filter-mapping >
None.gif
</ web-app >
None.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值