配色: 字号:
Servlet WEB过滤器
2016-08-29 | 阅:  转:  |  分享 
  
ServletWEB过滤器

WEB应用中的过滤器截取从客户端进来的请求,并做出处理的回答。它可以说是外部进入网站的第一道关。在这个头目里,可以验证客户是否来自枳的网络,可以对客户提交的数据进行重新编码,可以系统里获得配置的信息,可以过滤掉客户的某些不应出现的语汇,可以验证客户是否已经登录,可以验证客户端的浏览器是否支持当前应用,可以记录系统日志等。

可以为一个WEB应用组件部署多个过滤器,这过滤器组成一个过滤链,每个过滤器只执行某个特定的操作或者检查。这样请求在达到被访问的目标之前,需要经过这个过滤链。如果由于安全的问题不能访问目标资源,那么过滤器就可以把客户端的请求拦截。



Filter的开发

在应用开发中,我们经常使用的过滤功能就是对客户端的请求进行统一编码,对客户端进行认证,。下面我们做个例子,假设客户端要访问一个secutiry/index.jsp页面。这个页面接收一些参数,这些参数需要保存到数据库中,为了在数据库中使用相同的编码,可以开发一个过滤器对请求进行统一编码。secutiry目录下的所有页面都是受限制的页面,只有通过授权的用户才让访问,如果按照平常的方式,在每个页面都对用户进行授权,这样不权编程困难,而且代码的修改也很困难,这里来开发一个进行安全的检查过滤器。

packageeflylab;



importjavax.servlet.FilterChain;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjava.io.IOException;

importjavax.servlet.Filter;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.ServletException;

importjavax.servlet.FilterConfig;

/

要开发一个Filter,必须直接或间接实现Filter接口。

@authorAdministrator



/

publicclassEncodingFilterimplementsFilter

{

protectedFilterConfigfilterConfig;

privateStringtargetEncoding="gb2312";



/

初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。

/

publicvoidinit(FilterConfigconfig)throwsServletException{

this.filterConfig=config;

this.targetEncoding=config.getInitParameter("encoding");//获取FilterConfig中的参数

}



/

进行过滤处理,这个方法最重要,所有过滤处理的代码都在此实现。

/

publicvoiddoFilter(ServletRequestsrequest,ServletResponsesresponse,FilterChainchain)

throwsIOException,ServletException{

System.out.println("使用以下方法对请求进行编码:encoding="+targetEncoding);



HttpServletRequestrequest=(HttpServletRequest)srequest;

request.setCharacterEncoding(targetEncoding);

//把处理权发送到下一个

chain.doFilter(srequest,sresponse);

}



publicvoidsetFilterConfig(finalFilterConfigfilterConfig)

{

this.filterConfig=filterConfig;

}



//销毁过滤器

publicvoiddestroy()

{

this.filterConfig=null;

}

}







在Servlet常用接口中知道doFilter是过滤器中最重要的方法,通过这个方法进行实际的业务处理,在foFilter方法中,首先获得HTTP的请求和响应对象,然后对HTTP的请求和响应对象,然后对HTTP请求中的参数进行统一编码,这里采用的编码方式是GB2312。进行编码后,就把控制权转让给下一个过滤器。如果在这个过滤链中没有下一个过滤器,那么就会把请求直接发送到目标。

配置

Filter描述



encoding

eflylab.EncodingFilter



encoding

gb2312







下面我们来看一另一个Filter的开发,这个就是前面说到的用于对用户的访问认证。如果认证通过,那么允许访问指定资源,否则不行。

packageeflylab;



importjavax.servlet.FilterChain;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjava.io.IOExceptionHttpSession;

importjavax.servlet.Filter;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.ServletException;

importjavax.servlet.FilterConfig;

importjavax.servlet.http.HttpSession;



publicclassSignonFilterimplementsFilter

{

StringLOGIN_PAGE="login_signon.jsp";

protectedFilterConfigfilterConfig;



//过滤处理的方法

publicvoiddoFilter(finalServletRequestreq,finalServletResponseres,FilterChainchain)throwsIOException,ServletException

{

HttpServletRequesthreq=(HttpServletRequest)req;

HttpServletResponsehres=(HttpServletResponse)res;

HttpSessionsession=hreq.getSession();

Stringwww.wang027.comisLogin="";

isLogin=(String)session.getAttribute("isLogin");

if(isLogin.equals("true"))

{

System.out.println("在SignonFilter中验证通过");

//验证成功,继续处理

chain.doFilter(req,res);

}

else

{

//验证不成功,让用户登录。

hres.sendRedirect(LOGIN_PAGE);

System.out.println("被SignonFilter拦截一个未认证的请求");

}

}

catch(Exceptione)

{

e.printStackTrace();

}



}



publicvoidsetFilterConfig(finalFilterConfigfilterConfig)

{

this.filterConfig=filterConfig;

}



//销毁过滤器

publicvoiddestroy()

{

this.filterConfig=null;

}

/

初始化过滤器,和一般的Servlet一样,它也可以获得初始参数。

/

publicvoidinit(FilterConfigconfig)throwsServletException{

this.filterConfig=config;

}



}





在上面的代码中,首先通过isLogin=(String)session.getAttribute("isLogin")获得用户是否登录的属性。如果为真,则可以访问到目标资源,否则转向login_singnon.jsp

配置




xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">





eflylab.SessionListener







encoding

eflylab.EncodingFilter



encoding

gb2312







auth

eflylab.SignonFilter







encoding

/







auth

/security/





auth

/admin/







分类:JavaBase

献花(0)
+1
(本文系thedust79首藏)