Servlet中的filter过滤器

关键字:  servlet , filter , 过滤器 , 权限控制

转载并修改自:

  http://blog.youkuaiyun.com/lip009/archive/2006/10/17/1337730.aspx       http://tech.sina.com.cn/s/2009-11-19/00471138968.shtml

@Servlet里的过滤器的主要作用

1,任何系统或网站都要判断用户是否登录。

2,网络聊天系统或论坛,功能是过滤非法文字

3,统一解决编码

@Servlet3.0之前怎么创建一个过滤器

1,生成一个普通的class类,实现Filter接口(javax.servlet.Filter)

2,重写接口里面的三个方法:init,doFilter,destroy。

   其中的doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。

3,然后在web.xml配置过滤器。

具体例子:1.首先写一个权限过滤filter类,实现Filter接口

  import   javax.servlet.Filter;
  import   javax.servlet.FilterConfig;
  import   javax.servlet.ServletException;
  import   javax.servlet.ServletRequest;
  import   javax.servlet.ServletResponse;
  import   javax.servlet.FilterChain;
  import   java.io.IOException;
  import   javax.servlet.http.HttpServletRequest;
  import   javax.servlet.http.HttpSession;
  import   javax.servlet.http.HttpServletResponse;

  public     class   RightFilter
    
  implements   Filter   {
  
public void init(FilterConfig filterConfig) throws ServletException {
  }


  
public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain chain) 
throws IOException, ServletException {
    HttpServletRequest req 
= (HttpServletRequest) request;
     //如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中无法得到的方法
     //就要把此request对象构造成HttpServletRequest
    HttpServletResponse res 
= (HttpServletResponse) response;
    
    HttpSession session 
= req.getSession(true);

    
//从session里取的用户名信息
    String username = (String) session.getAttribute("username");
    
    
//判断如果没有取到用户信息,就跳转到登陆页面
    if (username == null || "".equals(username)) {
      
//跳转到登陆页面
      res.sendRedirect("http://"+req.getHeader("Host")+"/login.jsp");
    }

    
else {
      
//已经登陆,继续此次请求
      chain.doFilter(request,response);
       //调用FilterChain对象的doFilter方法
       //Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数
       //在调用此对象的doFilter方法时,激活下一个相关的过滤器
       //如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活
    }

  }


  
public void destroy() {
  }

}
   

2.然后在web.xml里配置需要登陆权限验证的JSP文件:

     a.如果是某个具体的JSP文件(如a.jsp)需要登陆验证

  <  web-app  > 
  ...
  
  <  filter  > 
    
  <  filter-name  >  right  filter-name > 
    
 < filter-class > com.taihuatalk.taihua.common.RightFilter filter-class > 
  
 filter > 

  
 < filter-mapping > 
    
 < filter-name > right filter-name > 
    
 < url-pattern > /a.jsp url-pattern > 
  
 filter-mapping > 
  ...
 web-app >

    b.如果是某一个目录(如a/目录)整个目录下的文件都需要登陆验证:

  <  web-app  > 
  ...
  
  <  filter  > 
    
  <  filter-name  >  right  filter-name > 
    
 < filter-class > com.taihuatalk.taihua.common.RightFilter filter-class > 
  
 filter > 

  
 < filter-mapping > 
    
 < filter-name > right filter-name > 
    
 < url-pattern > /a/* url-pattern > 
  
 filter-mapping > 
  ...
 web-app > 

 

@Servlet3.0中的创建过滤器:使用@WebFilter

@WebFilter用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是value、urlPatterns、servletNames三者必需至少包含一个,且value和urlPatterns不能共存,如果同时指定,通常忽略value的取值):

属性名类型描述

1.filterNameString指定过滤器的name属性。

2.valueString[]该属性等价于urlPatterns属性。但是两者不应该同时使用。

3.urlPatternsString[]指定一组过滤器的URL匹配模式。等价于标签。

4.servletNamesString[]指定过滤器将应用于哪些Servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中的取值。

5.dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括:

   ◆ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。

   ◆initParamsWebInitParam[]指定一组过滤器初始化参数,等价于标签。

   ◆asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于标签。

   ◆descriptionString该过滤器的描述信息,等价于标签。

   ◆displayNameString该过滤器的显示名,通常配合工具使用,等价于标签。

一个简单的示例:

@WebFilter(filterName = "AuthenticateFilter", urlPatterns ={"/stock.jsp""/getquote"})
public class AuthenticateFilter implements Filter {
    
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)     
throws IOException, ServletException {
        String username 
= ((HttpServletRequest) request).getParameter("uname");
        String password 
= ((HttpServletRequest) request).getParameter("password");
        
if (username == null || password == null) {
                 ((HttpServletResponse) response).sendRedirect(
"index.jsp");            

        } 
        if (username.equals("admin"&& password.equals("admin")) {
                chain.doFilter(request, response);      

        } else {
                ((HttpServletResponse) response).sendRedirect(
"index.jsp");        

        }
    }
    
public void destroy() {
    }

    public void init(FilterConfig filterConfig) {
    }
}

如此配置之后,就可以不必在web.xml中配置相应的和元素了,容器会在部署时根据指定的属性将该类发布为过滤器。

 

具体Servlet3.0相关的内容请参考:http://blog.youkuaiyun.com/flfna/archive/2010/05/16/5598201.aspx

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值