java web 过滤器和拦截器的区别和使用

 1.1 什么是拦截器: 

    拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈           Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2.    拦截器的实现原理: 

 大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

1.3 什么是过滤器

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:

①以常规的方式调用资源(即,调用servlet或JSP页面)。

②利用修改过的请求信息调用资源。

③调用资源,但在发送响应到客户机前对其进行修改。

④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

1.4 Servlet过滤器的基本原理

在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

2、拦截器与过滤器的区别 : 

     1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

拦截器的代码实现(以struts2为例):

1、在xml文件中如何定义拦截器

<interceptors>

 <interceptor name="filterIPInterceptor"

                         class="com.xxxx.web.FilterIPActionInterceptor" />

<interceptor-stack name="filterIPStack">

<interceptor-ref name="defaultStack" />

<interceptor-ref name="filterIPInterceptor" />

</interceptor-stack>

</interceptors>

 

2、怎么遍别写自定义拦截器 

 

public class FilterIPActionInterceptor extends AbstractInterceptor

{

    /** 日志控制. */

    private final Log log = LogFactory.getLog(getClass());

    /**

     * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)

     */

    @Override

    @SuppressWarnings("unchecked")

    public String intercept(ActionInvocation invocation) throws Exception

    {

        String result = null;

        // 获得当前方法名.

        String methodName = invocation.getInvocationContext().getName();

        String currIp = null;

        try

        {

            if (invocation.getAction() instanceof PortletAction)

            {

                PortletAction action = (PortletAction) invocation.getAction();

                currIp = action.getRequest().getRemoteAddr();

            }

            String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP");

            if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))

            {

                log.error("允许刷新的IP不存在或当前请求的IP非法.");

                throw new NoAllowIPException();

            }

            else

            {

                String[] ips = ip.split(",");

                boolean errorIp = true;

                for (String s : ips)

                {

                    if (s.equals(currIp))

                        errorIp = false;

                }

                // 判断IP

                if (errorIp)

                    throw new NoAllowIPException();

            }

            result = invocation.invoke();//调用被拦截的方法

        }

        catch (Exception e)

        {

            log.error("异常类名:" + invocation.getAction().getClass());

            log.error("异常方法:" + methodName, e);

            throw e;

        }

        return result;

    }

}

 

 

 

3、怎么编写过滤器

 

     1、在web.xml里面配置自定义的拦截器

     

   <filter>

<filter-name>Redirect Filter</filter-name>

<filter-class>com.xx.filter.RedirectFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>Redirect Filter</filter-name>

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

</filter-mapping>

    2、如何编写自定义的拦截器

public class RedirectFilter implements Filter {

       public void doFilter(ServletRequest request, ServletResponse response,

              FilterChain filterChain) throws IOException, ServletException {

    // 获取URL

   Long startTime = null;

        if (log.isDebugEnabled())

        {

            startTime = System.currentTimeMillis();

        }

              HttpServletRequest httpRequest = (HttpServletRequest) request;

                          String url = httpRequest.getRequestURL().toString();

                      if (url == null || url.trim().length() == 0) {

                                    return;

                                                   }

                     if (url.indexOf(luceneCreateMapping) != -1

                                  || url.indexOf(luceneSearchMapping) != -1) {

                               doFilterForxxx(request, response, url);

                               } else {

                                     doxxxx(request, response, url);

                                    }

         if (log.isDebugEnabled())

        {

            long endTime = System.currentTimeMillis();

            Thread currentThread = Thread.currentThread();

            String threadName = currentThread.getName();

            log.debug("[" + threadName + "]" + "< "

                    + this.getClass().getName() + " " + url + " "

                    + (endTime - startTime) + " ms");

        }

// 激活下一个Filter

 filterChain.doFilter(request, response);

        }

}

经本人亲测,此程序完全正确,若有不同意见,请留言

资料来源:http://www.ylzx8.cn/web/web/993988.html

struts2 过滤器和拦截器的区别和使用的更多相关文章

  1. Struts2之过滤器和拦截器的区别

    刚学习Struts2这个框架不久,心中依然有一个疑惑未解那就是过滤器和拦截器的区别,相信也有不少人跟我一样对于这个问题没有太多的深入了解 那么下面我们就一起来探讨探讨 过滤器,是在java web中, ...

  2. Struts2中过滤器和拦截器的区别

    拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...

  3. JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结

    对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...

  4. JavaWeb过滤器.监听器.拦截器-原理&区别(转)

    1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...

  5. Struts2 过滤器与拦截器

    学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下. 过滤器,是在java web中,你传入的request,re ...

  6. spring boot 过滤器、拦截器的区别与使用

    原文:https://blog.csdn.net/heweimingming/article/details/79993591 拦截器与过滤器的区别: 1.过滤器和拦截器触发时机不一样,过滤器是在请求 ...

  7. spring过滤器和拦截器的区别和联系

    一 简介 (1)过滤器: 依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理.在实现上基于函数回调,可 ...

  8. struts过滤器和拦截器的区别

    拦截器的工作原理:当接收到一个httprequest ,a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDisp ...

  9. Filter—过滤器和拦截器的区别

    1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...

随机推荐

  1. oracle 远程连接不到dba用户

    如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) http://www.111cn. ...

  2. matplotlib-2D绘图库-面向对象

    个人理解:plt--画本    figure--产生画纸 子图 import numpy as np import matplotlib.pyplot as plt #解决能显示中文 plt.rcPa ...

  3. DNN-HMM

    <<DNN-HMM.docx>>

  4. JAVA进阶2

    间歇性混吃等死,持续性踌躇满志系列-------------第2天 1.父类子类继承(注:一个JAVA源文件中只能有一个public类,public 类的名字必须和这个编译单元的文件名完全相同,包括大 ...

  5. MySQL - GROUP BY和HAVING的用法

    按姓名分组查询 SELECT username, COUNT(username) AS '人数' FROM t_user GROUP BY username 只查询姓名相同的人 SELECT user ...

  6. Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题

    在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方 ...

  7. 基于ATT和CK™框架的开放式方法评估网络安全产品

    场景 提供有关如何使用特定商业安全产品来检测已知对手行为的客观见解 提供有关安全产品和服务真实功能的透明度以检测已知的对手行为 推动安全供应商社区增强其检测已知对手行为的能力 地址 https://a ...

  8. python3-深浅copy

    转载:https://www.cnblogs.com/ctztake/p/8194275.html 术语 变量:是一个系统表的元素,拥有指向对象的连接空间. 对象:被分配的一块内存,存储其所代表的值. ...

  9. Linux中目录proc/net/dev详解【转】

    转自:https://blog.csdn.net/yzy1103203312/article/details/77848192 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  10. Python运维开发基础07-文件基础【转】

    一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...