Struts2拦截器概述(interceptor)

  • Struts2是框架,封装了很多的功能,Struts2里面封装的功能都是在拦截器里面
  • Struts2里面封装了很多的功能,有很多拦截器,并不是每次这些拦截器都会执行,每次只执行默认的拦截器
  • Struts2里面默认的拦截器位置:

  • 拦截器在上面时候执行?-----在action对象创建之后,action的方法执行之前。

Struts2拦截器底层原理

拦截器底层使用两个原理:

(1)AOP思想

文字描述:AOP,即面向切面编程,有基本的功能,想要扩展功能,但是不通过修改源代码的方式来扩展功能。

画图分析:

(2)责任链模式

在Java中有很多的设计模式,责任链模式是其中的一种,责任链模式和过滤链很相似的

过滤链:一个请求可有多个过滤器进行过滤,每个过滤器只有做放行才能到下一个过滤器。

责任链模式:要执行多个操作,有添加,修改,删除三个操作,首先执行添加操作,添加操作执行之后做类似于放行操作,执行修改操作,修改操作执行之后类似于放行操作,执行删除操作。

AOP思想和责任链模式如何应用到拦截器里面?

(1)文字描述:

拦截器在action对象创建之后,且在action的方法执行之前执行。在action方法执行之前执行默认拦截器,执行过程使用AOP思想,在action中没有直接调用拦截器的方法,而是使用配置文件方式进行操作。

在执行拦截器的时候,需要执行很多的拦截器,这个过程使用责任链模式,假如要执行三个拦截器,首先执行拦截器1,执行拦截器1之后做放行操作,再执行拦截器2,执行拦截器2之后做放行操作,最后执行拦截器3,执行拦截器3之后做放行操作,执行action中的方法。

(2)画图分析

(3)查看源代码

  • 执行action

  • 创建action对象,使用动态代理

  • 执行action中的方法

  • 执行很多的拦截器,遍历执行

  • 类似于放行的操作的方法

过滤器和拦截器的区别

(1)过滤器:过滤器理论上可以过滤任意内容,比如html,jsp,servlet,图片路径等

首先说一下Filter的使用地方,我们在配置web.xml时,总会配置下面一段设置字符编码,不然会导致乱码问题:

<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter><filter-mapping><filter-name>encoding</filter-name><servlet-name>/*</servlet-name>
</filter-mapping>

配置这个地方的目的,是让所有的请求都需要进行字符编码的设置,下面来介绍一下Filter。

过滤器(Filter):它依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。

(2)拦截器:拦截器只可以拦截action

拦截器的配置一般在SpringMVC的配置文件中,使用Interceptors标签,具体配置如下:

<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**" /><bean class="com.scorpios.atcrowdfunding.web.LoginInterceptor"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**" /><bean class="com.scorpios.atcrowdfunding.web.AuthInterceptor"></bean></mvc:interceptor>
</mvc:interceptors>

拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

对于上述过滤器和拦截器的测试,可以得到如下结论:
(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;

(4)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

参考链接:https://blog.csdn.net/zxd1435513775/article/details/80556034

自定义登陆拦截器

需求:在项目中,有很多action的超链接,实现只有是登陆的状态,才可以点击action的超链接实现功能,如果不是登陆状态,点击action超链接返回到登陆页面。

登陆的状态:使用session域对象实现

(1)登陆成功之后,把数据放到session里面

(2)判断session是否有值,可以指导是否是登陆状态

添加登陆拦截器功能:

(1)判断是否登陆,判断session里面是否有名称为username的值

(2)拦截器实现过程

第一步:创建类,继承MethodFilterInterceptor类

第二步:重写MethodFilterInterceptor类里面的方法写拦截器逻辑

第三步:配置action和拦截器关系(注册拦截器)

(1)在要拦截的action标签所在的package标签里面声明拦截器

(2)在具体的action标签里面使用声明的拦截器

(3)Struts2里面执行很多的默认拦截器,但是如果在action里面配置自定义拦截器,则默认的拦截器就不会执行了。

解决:把默认的拦截器手动使用一次。

问题:配置的拦截器,会对action中所有的方法都进行拦截

在action里面有login的登陆方法,这个方法不需要拦截,如果这个方法都拦截,那么出现很严重的问题是永远都登陆不进去。

解决:让login方法不进行拦截

直接通过配置方式让action里面的某些方法不进行拦截

Struts2常用标签

Struts2标签只能使用在jsp页面中

(1)s:property:和ognl表达式在jsp页面中获取值栈数据

(2)s:iterator:获取值栈list集合数据,表示list集合

(3)s:debug:查看值栈数据

Struts2表单标签(会用)

HTML表单标签

(1)form:action,method,enctype

(2)输入项:大部分在input里面封装,type=“值”

  • text:普通输入项
  • password:密码输入项
  • radio:单选输入项
  • checkbox:复选输入项
  • file:文件上传项
  • hidden:隐藏项
  • button:普通按钮
  • submit:提交按钮
  • image:图片提交
  • reset:重置

select:下拉输入项

textarea:文本域

Struts2里面对应HTML表单标签大部分都有

<!-- form标签 --><s:form><!-- 1 普通输入项 --><s:textfield name="username" label="username"></s:textfield><!-- 2 密码输入项 --><s:password name="password" label="password"></s:password><!-- 3 单选输入项 --><!-- value属性值和显示值一样的 --><s:radio list="{'女','男'}" name="sex" label="性别"></s:radio><!-- value属性值和显示值不一样的 --><s:radio list="#{'nv':'女','nan':'男'}" name="sex1" label="性别"></s:radio><!-- 4 复习输入项 --><s:checkboxlist list="{'吃饭','睡觉','敲代码'}" name="love" label="爱好">            </s:checkboxlist><!-- 5 下拉输入框 --><s:select list="{'幼儿园','博士后','教授'}" name="college" label="学历"></s:select>  <!-- 6 文件上传项 --><s:file name="file" label="上传文件"></s:file><!-- 7 隐藏项 --><s:hidden name="hid" value="abcd"></s:hidden><!--  文本域 --> <s:textarea rows="10" cols="3" name="resume" label="简历"></s:textarea><!-- 8 提交按钮 --><s:submit value="提交"></s:submit><!-- 9 重置 --><s:reset value="重置"></s:reset></s:form>

效果图:

Struts2框架详解(四)相关推荐

  1. struts2框架详解

    一.struts2简介 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的 ...

  2. NetCore框架详解 -------四、.NetCore框架对依赖注入原则 的技术实现和运行原理

    前三章主要从理论角度讲述了依赖注入原则及所衍生实现技术和手段产生的原因.发展和当前所处状况.大部分开发人为前三章对自己的技术水平的提高设有立竿见影的直接作用,但的我在里还是要说一下,前三章不但可以使开 ...

  3. Struts2框架详解(二)

    Struts2结果页面配置 全局结果页面 场景:多个action,有相同的方法返回值,且都到同一个结果页面 需求:创建两个action,执行默认的方法execute方法,让两个action的方法都返回 ...

  4. Linux内核Thermal框架详解十四、Thermal Governor(4)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  5. Linux内核Thermal框架详解十三、Thermal Governor(3)

    接前一篇文章Linux内核Thermal框架详解十二.Thermal Governor(2) 二.具体温控策略 上一篇文章介绍并详细分析了bang_bang governor的源码.本文介绍第2种温控 ...

  6. Linux内核Thermal框架详解十二、Thermal Governor(2)

    本文部分内容参考 万字长文 | Thermal框架源码剖析, Linux Thermal机制源码分析之框架概述_不捡风筝的玖伍贰柒的博客-CSDN博客, "热散由心静,凉生为室空" ...

  7. jQuery Validate验证框架详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.导入js库 <script type="text/javascript" src="& ...

  8. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

  9. WebDriver自动化测试框架详解

    webDriver自动化测试框架详解 一. 简介 WebDriver API相对于Selenium Remote Control API来说,虽然同样是控制浏览器,但它的编程接口更加简洁 WebDri ...

最新文章

  1. VC中栈溢出/Stack overflow怎么办?
  2. [Music]若是每个人都彼此关怀
  3. python绘图subplot绘制5幅图:以2行绘制,首行3幅图,次行2幅图居中(内含绘制3幅图简单版)
  4. 学生上课考勤系统jsp_基于jsp的学生课堂考勤-JavaEE实现学生课堂考勤 - java项目源码...
  5. 《直播疑难杂症排查》之三:首开慢
  6. 如何在SAP云平台上启用SAP Intelligent Robotic Process Automation - IRPA
  7. declaration of 'int ret' shadows a parameter
  8. php安装编译时 configure: error: Cannot find OpenSSL's evp.h
  9. wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测
  10. python开发框架大全_最受欢迎 Top 12 Python 开源框架,你都用过吗?
  11. 软件测试的八股文内容
  12. flashfxp和任务计划自动定时ftp备份
  13. canvas-八卦图和时钟实现
  14. Win7下载安装Mongodb教程
  15. 设计模式——组合模式
  16. 黑客是如何入侵网站?为什么企业网站需要渗透测试?
  17. tmp在java中的意思_tmp是什么文件?tmp文件用什么打开?图文讲解
  18. 经典SQL练习——详细到令人发指(未完待续)
  19. 30岁成功入职京东啦
  20. Mac/OSX 系统如何采集扬声器(代码实现 附源码)

热门文章

  1. MVC模式下的小试牛刀(附加案例过程详细实现步骤➕源代码)
  2. 易语言调用API控制组合框高度宽度居中下拉方向
  3. 用html制作的蚂蜂窝旅游网页设计,爬取马蜂窝用户评论页面
  4. Git学习————diff命令进行文件比较
  5. 测试边界值中的上点、内点、离点
  6. Windows 系统中的文件路径格式
  7. 职场上个人的核心技术_在职场中,个人能力和人际关系哪个更重要?
  8. 线程池Executors.newFixedThreadPool
  9. 执行Java时目录名称无效,如何修复目录名称无效
  10. Python listdir NotADirectoryError: [WinError 267] 目录名称无效。: ‘D:\\BaiduSyncdisk\\project\\pygame_demo\