Struts2的核心——拦截器
虽然以前已经学了很多的拦截器,但是在这里还是想重头梳理一下所有有关拦截器的知识,尤其是struts2中的拦截器
1:拦截器是什么?
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西。
Struts2中的很多功能都是由拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等等。
是AOP编程思想的一种应用形式。
2:执行顺序:
在struts2中,从服务器接受到用户请求开始,struts2的拦截器filter就将其产生的action进行拦截,根据配置文件struts.xml进行适配放行,去寻找action对应的Java的class,根据其返回值,返回到不同的jsp页面,但值得注意的是,拦截器是在服务器启动便加载了,并不是用到才加载,我们需要做的就是对struts.xml进行配置,将产生的请求动作配置到合适的动作类即可
3:自定义拦截器
1:自定义拦截器四步如下:
1>.添加一个类,让它继承AbstractInterceptor类,或者实现Interceptor接口
public class TimeInterceptor extends AbstractInterceptor {
/**
* 拦截器的核心方法intercept的返回值是一个字符串
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
return "login";
}
}
2>.在struts.xml的package中添加interceptors子节点,并在它下面添加Interceptor节点
<package name="goods" namespace="/goods" extends="common-pkg">
<interceptors>
<interceptor name="timeInterceptor" class="com.wskj.struts2.interceptor.TimeInterceptor"></interceptor>
</interceptors>
</package>
3>.在想被拦截的action节点下添加子节点interceptor-ref
<action name="list_Category" class="com.wskj.struts2.controller.CategoryAction" method="list">
<interceptor-ref name="timeInterceptor"></interceptor-ref>
<result name="list" type="dispatcher">/pages/Category/list.jsp</result>
</action>
3.配置默认的拦截器
<!-- 设置默认的拦截器 -->
<default-interceptor-ref name="timeInterceptor"></default-interceptor-ref>
2:在我们自己写拦截器之前首先要清楚,当我们自己写了拦截器时,struts2默认的拦截器就不再起作用了,但是我们还是需要struts2的大部分的拦截器,这个时候怎么办呐?以检查登陆为例渐进性的谈谈这个问题:
a、把默认拦截器加入到配置文件中
b、a中暴露的问题:当有多个拦截器时,需要改写的地方非常多。
解决办法:抽取公共的包,把全局配置放入公共包中。

c、b中的问题:还要再每个动作方法中引入拦截器。能不能不写呢?
思路:我们在设置【开发模式】时,覆盖掉了一个default.properties中的常量,能不能把struts-default.xml中的默认拦截器栈的设置给覆盖掉呢?答案是可以的。
解决办法:
d、c中出现的问题:当使用了默认拦截器栈,这时候三个动作login,showIndex和show1Action都将被检查登录的拦截器拦截。
解决办法:
需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的:

所以我们在自定义拦截器时,还可以继承MethodFilterInterceptor并且重写doIntercept方法。

并且在struts的配置文件中,配置需要拦截哪些方法,和需要放过哪些方法。

e、d中遗留的问题:我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,不确定方法名叫什么。
解决办法:我们需要在使用拦截器的时候给它注入参数。

经过这些步骤,自定义拦截器就基本完成了!
疑问:b中抽取公共包在进行需要拦截方法的配置即可,与e方法配置和注入相比并不是很麻烦,为什么还要选择e方法呐?
Struts2的核心——拦截器的更多相关文章
- Struts2(五)——核心拦截器
Struts框架一共为我们提供了35个拦截器,其中默认的拦截器有18个,框架访问action的异常处理,配置信息处理,转发重定向选择,上传等等等等,都是这18个拦截器中设置的,起着非比寻常的作用.而这 ...
- 十五、struts2中的拦截器(框架功能核心)
十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...
- 5.Struts2中的拦截器
拦截器是Struts2中的核心,其自带很多很多的拦截器,这里主要介绍一下自定义拦截器,恩多一半情况下呢?我们不需要使用到自定义的拦截器,Struts2本身已经提 供了很多的拦截器供我们使用,对于自定义 ...
- Struts2(十四)拦截器实现权限管理
一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...
- Struts2笔记_拦截器
A.拦截器是什么 --- Interceptor:拦截器,起到拦截Action的作用. ---Filter:过滤器,过滤从客户端向服务器发送的请求. ---Interceptor:拦截器,拦截是客户端 ...
- struts2内置拦截器和自定义拦截器详解(附源码)
一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...
- Struts2学习之拦截器
© 版权声明:本文为博主原创文章,转载请注明出处 拦截器: - Struts2大多数核心功能都是通过拦截器实现的,每个拦截器完成某项功能 - 拦截器方法在Action执行之前或之后执行 工作原理: - ...
- struts2基础——自定义拦截器
一.自定义拦截器 默认的拦截器能实现的功能是有限的,Struts2 支持自定义拦截器. 二.拦截器类 1.实现 Interceptor 接口 2.继承 AbstractInterceptor 抽象类, ...
- Struts2透过自定义拦截器实现登录之后跳转到原页面
Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...
随机推荐
- python 中 *args 和 **kwargs 的区别
在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思.*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型.下文举例说明 ...
- JVM(三)对象的生死判定和算法详解
好的文章是能把各个知识点,通过逻辑关系串连起来,让人豁然开朗的同时又记忆深刻. 导读:对象除了生死之外,还有其他状态吗?对象真正的死亡,难道只经历一次简单的判定?如何在垂死的边缘"拯救&qu ...
- Django 系列博客(十六)
Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...
- SpringCloud系列——Feign 服务调用
前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...
- 【小o地图Excel插件版】不止能做图表,还能抓58、大众点评网页数据...
小o地图Excel插件版:一款基于Excel软件开发的地图软件,提供基于Excel表格进行地理数据挖掘.地理数据分析.地图绘制.地图图表等功能的工具类软件.具有易用.高效.稳定的特点,能够满足地理数据 ...
- MySql 双主多从配置指导
MySql 双主多从配置指导 一.背景 互联网项目为了数据的可靠性和架构的可拓展性经常会用到双主多从的数据库,来实现数据的备份.负载均衡和突发状况时数据库切换. 二.思路 配置两台数据库A.B互为主从 ...
- Cookie的一点认识!
使用cookie的时间不短了,但是每次都是用一点查一点,也没有总结过.趁着项目不忙的间隙,总结一下.首先说为什么要使用cookie,什么是cookie cookie是用户访问一些网站后,浏览器生成的给 ...
- jsonp promise 封装
import originJsonp from 'jsonp' export default function jsonp(url, data, option) { url += (url.index ...
- 51nod“省选”模测第二场 B 异或约数和(数论分块)
题意 题目链接 Sol 这题是来搞笑的吧.. 考虑一个数的贡献是\(O(\frac{N}{i})\) 直接数论分块. #include<bits/stdc++.h> #define Pai ...
- Java实现登录验证码
登录验证码 Servlet /* 从请求中获取数据,获取验证码的session的值转为String类型, 销毁,防止返回后验证码不刷新,重新验证成功 判断验证码是否相同(忽略大 ...