1、首先要明确什么是拦截器、什么是过滤器   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);

        }}

转载自https://zhidao.baidu.com/question/583953960492530045.html

转载于:https://www.cnblogs.com/sobright/p/6618859.html

Struts2 拦截器: 拦截器与过滤器区别相关推荐

  1. Springmvc中的拦截器interceptor及与过滤器filter的区别

    一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...

  2. 什么是拦截器?什么是过滤器?

    原文链接:https://www.longkui.site/program/frontend/pipe/4408/ 0.背景 写项目的时候用到了拦截器,会决定哪些接口拦截,哪些接口不拦截.偶尔一次等保 ...

  3. Struts2框架之拦截器

    1:拦截器类似web过滤器,在action执行之前或者执行之后去取一些操作 2:拦截器栈就是递归调用 strust2的工作流程: 客户端通过HttpServletRequest向Tomcat容器发送请 ...

  4. Struts2内置拦截器的简要介绍

    http://www.th7.cn/Program/java/201405/195296.shtml 标记有(*)要着重了解: (1)alias(别名拦截器):允许参数在跨越多个请求时使用不同别名,该 ...

  5. struts2如何使用拦截器进行用户权限控制

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...

  6. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

  7. Vue << 拦截器(interceptors ) 过滤器(filter)

    拦截器(interceptors) 在axios 请求或响应被 then 或 catch 处理前拦截它们. 设置请求拦截器 // 设置请求头axios.defaults.headers = {'Con ...

  8. Struts2学习三拦截器

    JAVA Struts2 DAY05 拦截器HelloWorld 扩展拦截器HelloWorld NetCTOSS登录检查 上传文件 1 拦截器HelloWorld 1.1 问题 写一个拦截器的Hel ...

  9. struts2控制器及拦截器返回JSON格式数据

    1.     JSON插件 想要使用json必定会用到jquery. 1.1        导入相关的Ajax-jar包-01资料中ajax文件中. commons-beanutils-1.8.0.j ...

最新文章

  1. h.264的POC计算
  2. leetcode算法题--摆动序列★
  3. android 字符串,textview
  4. 送人玫瑰,手留余香,如果本博客帮助到你了,帮忙点开本篇投上一票
  5. Windows使用筛选器来处理异常
  6. C语言入门经验:零基础如何学习C语言?
  7. 牛X,试用了下GitHub上22万Star的第一抢票神器,3秒钟抢到!
  8. windows部署免安装版python
  9. 跨编程语言平台的通信
  10. python 分词及语义识别
  11. fiddler手机模拟器抓包_fiddler抓取手机模拟器数据
  12. 天梯赛座位 分配分数 20作者 陈越单位 浙江大学
  13. infercnv报错Error in base::rowMeans(x, na.rm = na.rm, dims = dims, ...) : ‘x‘ must be an array of a
  14. 设计模式 - 创建型模式_工厂方法模式
  15. 回答华为公司面试题一头牛重800公斤一座桥承重700公斤问牛怎么过桥?
  16. linux串口termios
  17. 数据安全技术体系建设的思考
  18. Pandas 如何保存较大文件。‘ValueError: This sheet is too large! Your sheet size is: 16388602, 3 Max sheet size
  19. checkbox选中和不选中 jqu_JQuery控制radio选中和不选中方法总结
  20. 在SAP中使用标准表维护SM30说明

热门文章

  1. javascript --- XHR(XMLHttpRequet)对象
  2. javascript --- 使用对象关联简化整体设计
  3. ES5-拓展 this指向的总结
  4. API网关如何实现对服务下线实时感知
  5. 大数据和人工智能的关系是什么?
  6. 为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
  7. Linux运维系统工程师系列---13
  8. 《DirectX 9.0 3D游戏开发编程基础》 第二章 绘制流水线 读书笔记
  9. a与a:link、a:visited、a:hover、a:active
  10. Ubuntu12 10下安装JDK7