拦截器和过滤器的区别

过滤器是servlet规范中的一部分,任何java web工程都可以使用。

拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器它是只有进入struts2核心内部之后,才会起作用,如果访问的是jsp,html,css,image或者js是不会进行拦截的。

同时,拦截器还是AOP编程思想的具体体现形式。AOP(Aspect-Oriented Programming)简单的说就是:

在不修改源码的基础上,已有的方法进行动态增强。

在struts2中,拦截器它就是对我们的动作方法进行增强。(其实就是把重复性的代码提取出来,然后放到拦截器中,统一管理,统一调用)

1.1.1 拦截器的执行时机

在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构。

1.2自定义拦截器
在程序开发过程中,如果需要开发自己的拦截器类,就需要直接或间接的实现com.opensymphony.xwork2.interceptor.Interceptor接口。其定义的代码如下:
public interface Interceptor extends Serializable {
void init();
void destroy();
String intercept(ActionInvocation invocation) throws Exception;
}
该接口提供了三个方法,其具体介绍如下。
void init():该方法在拦截器被创建后会立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化
void destroy():该方法与init方法相对应,在拦截器实例被销毁之前,将调用该方法来释放和拦截器相关的资源它在拦截器的生命周期内,也只被调用一次
String intercept(ActionInvocation invocation) throws Exception:该方法是拦截器的核心方法,用来添加真正执行拦截工作的代码,实现具体的拦截操作。它返回一个字符串作为逻辑视图系统根据返回的字符串跳转到对应的视图资源每拦截一个动作请求, 该方法就会被调用一次。该方法的ActionInvocation参数包含了被拦截的Action的引用,可以通过该参数的invoke()方法,将控制权转给下一个拦截器或者转给Action的execute()方法。
如果需要自定义拦截器,只需要实现Interceptor接口的三个方法即可。然而在实际开发过程中,除了实现Interceptor接口可以自定义拦截器外,更常用的一种方式是继承抽象拦截器类AbstractIntercepter。该类实现了Interceptor接口,并且提供了init()方法和destroy()方法的空实现。使用时,可以直接继承该抽象类,而不用实现那些不必要的方法。拦截器类AbstractInterceptor中定义的方法如下所示:
public abstract class AbstractInterceptor implements Interceptor {
public void init() {}
public void destroy() {}
public abstract String intercept(ActionInvocation invocation)
throws Exception;
}
从上述代码中可以看出,AbstractInterceptor类已经实现了Interceptor接口的所有方法,一般情况下,只需继承AbstractInterceptor类,实现interceptor()方法就可以创建自定义拦截器。
只有当自定义的拦截器需要打开系统资源时,才需要覆盖AbstractInterceptor类的init()方法和destroy()方法。与实现Interceptor接口相比,继承AbstractInterceptor类的方法更为简单。
当然还有更简单的,AbstractInterceptor还有一个子类,MethodFilterInterceptor,该类中提供了两个属性,可以告知拦截器对哪些方法进行拦截或者对哪些方法排除。

下图展示的就是拦截器的类结构视图:

1.2.1自定义步骤
通过在拦截器类视图上我们可以得知,我们定义拦截器可以有三种办法:
第一种:定义一个类,实现Interceptor接口
第二种:定义一个类,继承AbstractInterceptor
第三种:定义一个类,继承MethodFilterInterceptor
在这三种方式中,我们选择第二种和第三种都可以。那么后两种有什么区别呢?
我们来看看AbstractorInteractor类中的代码:

我们再来看看MethodFilterInterceptor中的代码:

看完两个类之后,我们有了结论。即:选择第三种方式,比第二种多了一个功能,就是告知拦截器哪些方法我们需要拦截,哪些方法我们不需要拦截。(注意:不要想着很傻的问题,在需要拦截和不需要拦截的属性中提供同一个方法)
根据以上的内容,我们开始编写我们自己的拦截器。

1.1.1 拦截器的放行

上一章节,我们演示时,发现没有放行,在拦截器中如何放行呢?我们之前已经介绍过几个拦截器了,例如ServletConfigInterceptor拦截器,可以看看它是怎么放行的。拦截器的方式:

invocation.invoke()方法。请看下面的代码:

/**

* 自定义拦截器

*/

public class MyInterceptor extends AbstractInterceptor {

@Override

public String intercept(ActionInvocation invocation) throws Exception {

System.out.println("执行动作方法之前:MyInterceptor拦截了。。。。");

String rtValue = invocation.invoke();//放行

System.out.println("执行动作方法之后:MyInterceptor拦截了。。。。");

System.out.println(rtValue);

return rtValue;

}

}

当上面的代码执行完,发现action和jsp都执行了。那么这个rtValue值是什么呢?

1.1.2 拦截器的返回值

其实拦截器的返回值,就是我们Action中,执行的动作方法返回值。

Struts注解开发

1.1.1 @Action

出现的位置:

它只能出现在Action类上或者动作方法上。一般情况下都是写在动作方法上。

作用:

指定当前动作方法的动作名称。也就是xml配置时action标签的name属性。

属性:

value:指定动作名称。

results[]:它是一个数组,数据类型是注解。用于指定结果视图。此属性可以没有,当没有该属性时,表示不返回任何结果视图。即使用response输出响应正文。

interceptorRefs[]:它是一个数组,数据类型是注解。用于指定引用的拦截器。

1.1.1 @Result

出现的位置:

它可以出现在动作类上,也可以出现在Action注解中。

作用:

出现在类上,表示当前动作类中的所有动作方法都可以用此视图。

出现在Action注解中,表示当前Action可用此视图。

属性:

name:指定逻辑结果视图名称。

type:指定前往视图的方式。例如:请求转发,重定向,重定向到另外的动作。

location:指定前往的地址。可以是一个页面,也可以是一个动作。

面试题:struts 拦截器和过滤器的更多相关文章

  1. Spring拦截器和过滤器

    什么是拦截器 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者 ...

  2. Spring Boot2(七):拦截器和过滤器

    一.前言 过滤器和拦截器两者都具有AOP的切面思想,关于aop切面,可以看上一篇文章.过滤器filter和拦截器interceptor都属于面向切面编程的具体实现. 二.过滤器 过滤器工作原理 从上图 ...

  3. java 拦截器和过滤器区别(转载)

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

  4. java 中的拦截器和过滤器

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

  5. Java Web 拦截器和过滤器的区别

    一.AOP:面向切面编程,Java Web中有两个常用的技术:拦截器.过滤器 二.拦截器 1.定义:在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作 2.原理:大部分时候,拦截器方法都 ...

  6. springMVC拦截器和过滤器总结

    拦截器: 用来对访问的url进行拦截处理 用处: 权限验证,乱码设置等 spring-mvc.xml文件中的配置: <beans xmlns="http://www.springfra ...

  7. SpringMVC学习笔记:拦截器和过滤器

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

  8. struts2拦截器和过滤器区别

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

  9. SpringBoot中拦截器和过滤器的使用

    一.拦截器 三种方式 继承WebMvcConfigurerAdapter   spring5.0 以弃用,不推荐 实现WebMvcConfigurer  推荐 继承WebMvcConfiguratio ...

随机推荐

  1. 使用javah生成jni 头文件和使用ndk编译so库

    1.jni 首先clean Project,在makeProject生成对应的class文件 然后点出命名框,输入命令: cd app/build/intermediates/classes/debu ...

  2. LeetCode OJ:Sort Colors(排序颜色)

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  3. BEC listen and translation exercise 11

    When you are in any contest you should work as if there were — to the very last minute — a chance to ...

  4. 3.20 内存及效率的一些总结 3.21 设置竖屏 3.22 CCLOG与CCLog区别

    3.20 内存及效率的一些总结 3.21 设置竖屏 1.android AndroidManifest.xml文件中, screenOrientation="landscape" ...

  5. apache php配置 虚拟目录 和 虚拟主机 多域名配置 原理解析

    虚拟目录配置 就是说,我们放项目放在D盘,F盘,而不是默认的www文件夹下也可以访问.比如这里,我在 D:/PHP/work 放入的项目文件. 在httpd.conf加入: (位置一般是在 </ ...

  6. POJ - 2187:Beauty Contest (最简单的旋转卡壳,求最远距离)

    Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest, earning the ti ...

  7. @Override重写

    package com.wisezone.f; //父类 public class Person { //姓名 private String name; //年龄 private int age; / ...

  8. markdown的学习

    开始 语法 编辑器 sublime配置 图床 体验 开始 昨天晚上加上今天上午,折腾了算是一天的markdown编辑器. 原因是,为了写博客.在博客园写的东西,想法不到简书里,结果发现有部分乱码,以及 ...

  9. 0. LeetCode 开篇

    LeetCode 开篇 很久以前(也许是几天之前,记忆力没那么好),听朋友说过,但是没怎么重视,最近发现自己基础打的不牢(会是会,但是说不出来,说不明白),故借此机会理一理知识点,并复习,巩固相关知识 ...

  10. JavaScript函数的默认参数(default parameter)

    JavaScript函数的默认参数(default parameter) js函数参数的默认值都是undefined, ES5里,不支持直接在形参里写默认值.所以,要设置默认值,就要检测参数是否为un ...