﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-行动创造奇迹-随笔分类-Controller </title><link>http://www.blogjava.net/dorydoo/category/12617.html</link><description>Action Action Action</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:50:36 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:50:36 GMT</pubDate><ttl>60</ttl><item><title>过滤</title><link>http://www.blogjava.net/dorydoo/archive/2006/06/29/55706.html</link><dc:creator>多力宇扬</dc:creator><author>多力宇扬</author><pubDate>Thu, 29 Jun 2006 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/dorydoo/archive/2006/06/29/55706.html</guid><wfw:comment>http://www.blogjava.net/dorydoo/comments/55706.html</wfw:comment><comments>http://www.blogjava.net/dorydoo/archive/2006/06/29/55706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dorydoo/comments/commentRss/55706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dorydoo/services/trackbacks/55706.html</trackback:ping><description><![CDATA[
		<p>在web应用中实施过滤是我们常用的技术,通过过滤,可以对请求进行统一编码,对请求进行认证等.每个Fillter可能只担任很少的任务,多个Filter可以互相协作,通过这种协作,可以完成一个复杂的功能.<br /><br />Fileter<br />声明: public interface Filter<br />它是Filter必须实现的接口,它包含一下的方法<br />. init(FilterConfig config): 这个方法初始化Filter.<br />. doFilter(ServletRequest request,ServletResponse,FilterChain chain): Filter的业务方法就在这里实现.<br />. destory(): 释放Filter占用的资源.<br /><br />FilterChain<br />声明: public interface FilterChain<br />它是代码的过滤链,通过这个接口把过滤的任务在不同的Filter之间转移.它包含一个方法: <br />doFilter(ServletRequest,request,ServletResponse response)<br />通过这个方法来调用下一下Filter,如果没有吓一个Filter,那么将调用目标资源.<br /><br />FilterConfig<br />声明: public interface FilterConfig<br />代表了Filter的配置,和Servlet一样,Servlet也有一些配置信息,比如名字和初始化参数等.<br />它包含以下的方法.<br />.getFilterName(): 返回Filter的名字.<br />.getInitParameter(String name): 获得名称为name的初始化参数<br />.getServletContext(): 返回这个Filter所在Servlet上下文对象.<br />.getInitParameterNames(): 获得Filter配置中的所有初始化参数的名字.<br /><br />过滤器主要对客户端的请求和客户端的响应进行统一处理.最常见的web过滤器有权限认证过滤器,字符编码过滤器,图象处理过滤器等.<br /><br />字符编码过滤器(EncodingFillter.java)<br />package dorydoo.util;</p>
		<p>import javax.servlet.FilterChain;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;<br />import java.io.IOException;<br />import javax.servlet.Filter;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.ServletException;<br />import javax.servlet.FilterConfig;<br />/**<br /> *<br /> * @author Dory Doo<br /> */<br />public class EncodingFillter implements Filter<br />{<br />    protected FilterConfig filterConfig;<br />    private String targetEncoding="gb2312";<br />    /**<br />     *初始化过滤器像一般的Servlet一样,它也可以获得初始化参数<br />    */<br />    public void init(FilterConfig config)throws ServletException<br />    {<br />        this.filterConfig=config;<br />        this.targetEncoding=config.getInitParameter("encoding");<br />    }<br />    /**<br />     *进行过滤处理，最最要的地方就是这里了<br />    */<br />    public void doFilter(ServletRequest srequest,ServletResponse sresponse,FilterChain chain)<br />    throws IOException,ServletException<br />    {<br />        System.out.println("使用以下方法进行编码:encoding="+targetEncoding);<br />        <br />        HttpServletRequest request=(HttpServletRequest)srequest;<br />        request.setCharacterEncoding(targetEncoding);<br />        //把处理权发送到下一个<br />        chain.doFilter(srequest,sresponse);<br />    }<br />    <br />    public void setFilterConfig(final FilterConfig filterConfig)<br />    {<br />        this.filterConfig=filterConfig;<br />    }<br />    //销毁过滤器<br />    public void destroy()<br />    {<br />        this.filterConfig=null;<br />    }<br />}<br />然后在web.xml中配置我们的应用.<br /> &lt;web-app&gt;<br />      .................<br />        &lt;!--Filter Config--&gt;<br />       &lt;filter&gt;<br />            &lt;filter-name&gt;cncoding&lt;/filter-name&gt;<br />            &lt;filter-class&gt;dorydoo.util.EncodingFilter&lt;/filter-class&gt;<br />            &lt;init-param&gt;<br />                &lt;param-name&gt;encoding&lt;/param-name&gt;<br />                &lt;param-value&gt;gb2312&lt;/param-value&gt;<br />            &lt;/init-param&gt;<br />        &lt;/filter&gt;   <br />        &lt;filter-mapping&gt;<br />            &lt;filter-name&gt;encoding&lt;/filter-name&gt;<br />            &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />        &lt;/filter-mapping&gt;  <br />        &lt;filter-mapping&gt;<br />            &lt;filter-name&gt;encoding&lt;/filter-name&gt;<br />            &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />        &lt;/filter-mapping&gt;<br />      ........<br /> &lt;/web-app&gt;<br /><br /><br />在来看一用户认证的过滤器(SignonFilter)<br />package dorydoo.util;</p>
		<p>import javax.servlet.FilterChain;<br />import javax.servlet.ServletRequest;<br />import javax.servlet.ServletResponse;<br />import java.io.IOException;<br />import javax.servlet.Filter;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.ServletException;<br />import javax.servlet.FilterConfig;<br />import javax.servlet.http.HttpSession;<br />/**<br /> *<br /> * @author DuYang<br /> */<br />public class SignonFilter implements Filter<br />{<br />    protected FilterConfig filterConfig;<br />    String LOGIN_PAGE="login.jsp";<br />    /**<br />     *初始化过滤器像一般的Servlet一样,它也可以获得初始化参数<br />    */<br />    public void init(FilterConfig config)throws ServletException<br />    {<br />        this.filterConfig=config;<br />    }<br />    /**<br />     *进行过滤处理，最最要的地方就是这里了<br />    */<br />    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)<br />    throws IOException,ServletException<br />    {     <br />        HttpServletRequest hreq=(HttpServletRequest)req;<br />        HttpServletResponse hres=(HttpServletResponse)res;<br />        HttpSession session=hreq.getSession();<br />        String isLogin="";<br />        try<br />        {<br />            isLogin=(String)session.getAttribute("isLogin");<br />            if(isLogin.equals("true"))<br />            {<br />                System.out.println("在SignonFilter中验证通过");<br />                //验证通过继续处理<br />                chain.doFilter(req,res);<br />            }<br />            else<br />            {<br />                //验证不成功重新登录<br />                hres.sendRedirect(LOGIN_PAGE);<br />                System.out.println("被SignonFilter拦截一个为认证的请求");<br />            }<br />        }<br />        catch(Exception e)<br />        {<br />            e.printStackTrace();<br />        }<br />    }<br />    <br />    public void setFilterConfig(final FilterConfig filterConfig)<br />    {<br />        this.filterConfig=filterConfig;<br />    }<br />    //销毁过滤器<br />    public void destroy()<br />    {<br />        this.filterConfig=null;<br />    }<br />}<br />在SignonFilter的doFilter()方法中,首先通过isLogin=(String)session.getAttribute("isLogin");判断是否登录用户,如果不是则返回到login页面.配置web.xml文件就和上面的基本上没什么差别.<br /></p>
<img src ="http://www.blogjava.net/dorydoo/aggbug/55706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dorydoo/" target="_blank">多力宇扬</a> 2006-06-29 11:23 <a href="http://www.blogjava.net/dorydoo/archive/2006/06/29/55706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>