`
ddoudd
  • 浏览: 4927 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
社区版块
存档分类
最新评论

拦截器与过滤器

 
阅读更多
很多人都了解过滤器也听说过拦截器,但是要是区分它们的不同点还真是真的说不清楚,一下可以简要的说明:
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
--------------------------------------------------------------------------------
拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object result = null;
System.out.println("before invoke method :" + method.getName());
result = method.invoke(this.targetObj, args);
System.out.println("after invoke method : " + method.getName());
return result;
}

过滤器是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。

Java中的过滤器实例(解决乱码问题)

一,创建Servlet 继承于HttpServlet 并实现Filter这个过滤器的接口
package com.sun.test;

import java.io.IOException;

import javax.servlet.*;

import javax.servlet.http.HttpServlet;

/***

 * 

 * 功能:处理中文乱码的过滤器  (一个Servlet  实现  Filter的接口)

 *

 */

public class MyFilter extends HttpServlet  implements   Filter {

    protected String encoding = null;  //声明一个存储编码的属性

    protected FilterConfig filterConfig = null; //创建一个过滤器配置对象

   /**

    * 销毁

    */

    public void destroy() {

          this.encoding = null;

          this.filterConfig = null;

     System.out.println("------------------过滤器执行结束了--------------");

    }

 /**

  * 执行

  */

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain  chain) throws IOException, ServletException {

       System.out.println("------------------正在执行过滤器------------------");

          // 选择并设置要使用的字符编码

          if((request.getCharacterEncoding()==null)){

              String encoding = selectEncoding();  //或得配置文件里面的编码设置

              if(encoding!=null){

                 request.setCharacterEncoding(encoding); //重新设置字符编码 , 顾虑完毕

              }

          }

          // 将控制权传递到下一个过滤器

          chain.doFilter(request, response);

    }

/**

 * 初始化

 */

    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("------------正在初始化--------------");

          this.filterConfig = filterConfig; //初始化过滤器的配置

          this.encoding = filterConfig.getInitParameter("charset"); //获得配置文件里面的编码并初始化给声明的存储编码的属性

    }

    //对编码的设置进行封装

    protected String selectEncoding() {

          return (this.encoding);

          }

}

二,过滤器写好了还要在配置文件(web.xml)里面声明,并将其映射到整个程序里面使用:
<!-- 配置一个过滤器 -->

    <filter>

      <filter-name>TestFilter</filter-name>

      <filter-class>com.sun.TestFilter</filter-class>

      <init-param>

        <param-name>charset</param-name>

        <param-value>gb2312</param-value>

      </init-param>

    </filter>

   <!-- 映射到程序中使用 --> 

    <filter-mapping>

      <filter-name>TestFilter</filter-name>

      <url-pattern>/*</url-pattern>

    </filter-mapping>

转自:http://www.2cto.com/kf/201108/101110.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics