SSH框架学习之struts2 ---- 4、自定义Struts的拦截器

概述

拦截器(interceptor):struts2独有的概念。struts2里面的很多功能封装在拦截器(表单获取中的模型驱动等,值栈传递数据等)

每次只执行默认拦截器
在这里插入图片描述

拦截器执行的时间

action对象创建之后,action方法执行之前

1、拦截器的底层原理

1.1 两种思想

1) aop思想(底层用到动态代理,spring时深入)
面向切面(方面)编程,不修改源代码来拓展功能(通过配置,把他们关联起来)。

2)责任链模式
设计模式中的一种,和过滤链很相似。

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

责任链:要执行一连串操作,只有当前操作放行,下一个操作才能执行

1.2 两种思想如何运用到拦截器的

拦截器中的默认拦截器,是在每次action方法之前生效的。

aop思想:在action没有直接使用拦截器的方法,而是通过配置文件配置进去。

责任链:很多个拦截器,使用责任链。

1.3 源代码分析

1、在这里插入图片描述
2、创建action的代理对象
用动态代理创建代理对象,和new出来的不一样,ActionProxy 能实现和action一样的功能。

在这里插入图片描述
3、执行action的方法
在这里插入图片描述4、执行很多拦截器,遍历执行
在这里插入图片描述
5、类似于放行操作
在这里插入图片描述

1.4 过滤器和拦截器的区别

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

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

2、自定义拦截器

在这里插入图片描述
(2) 开发中,写一个类,继承MethodFilterInterceptor类实现,这样做可以让action里面某个方法不进行拦截

(3) 让拦截器和action有关系,这运用了aop思想

不在action里面调用拦截器的方法,而是通过配置文件建立关系

2.2 需求分析

只有登陆的状态,才能点击action的超链接,否则返回到登陆页面

登陆成功后,让session中放入值,用于判读是否登陆

EL表达式复习: 在jsp中取域对象session中的值
${sessionScope.username} 或者 ${username}

2.3 实现登陆拦截器

拦截器判断session里面是否有名称是username的值

第一步:创建类,继承MethodFilterInterceptor

第二步:重写类里面的方法,写拦截器逻辑
在这里插入图片描述
第三步:配置action和拦截器的关系(注册拦截器)AOP思想。
(1)在你要拦截的action标签所在的package标签里面声明拦截器
(2)在具体的action标签里面使用声明好的拦截器

(3)struts2里面会执行很多默认的拦截器,但是我们一旦配置了自定义拦截器,那么默认拦截器不会执行,因此需要解决。

解决:手动把默认拦截器配置进去

在这里插入图片描述

可以把包里面的所有都复制进去,或者复制包。

在这里插入图片描述

2.4 对部分方法不拦截

我们配置完,拦截器会对所有方法进行拦截,可是我们的登陆功能也在里边,如果也进行拦截,那永远无法登陆。

对login进行不过滤

在这里插入图片描述

2.5 项目的小问题,表单递归了。

在这里插入图片描述

解决:

在这里插入图片描述

表示在它的父页面打开

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值