第三章 Struts2拦截器
struct2

Struts2相关Struts2是一个按照MVC模式设计的web层框架,其实Struts2就是一个大大的filter,我们可以在web.xml文件中讲符合某种特征的所有请求交给这个filter处理,这个filter再参照一个配置文件(通常为/WEB-INF/classes/struts.xml)将各个请求分别分配给不同的action去处理!Struts2的核心FilterDispatcher, 从2.1.3版本开始, 换成了StrutsPrepareAndExecuteFilter. 官方为什么要做这个升级呢?首先看下官方给的Struts2工作原理图:Struts2工作原理(基于看完上图的理解):当一个HttpServletRequest请求来了,先经过ActionContextCleanUp过滤器,清除Action环境,再经过其他的过滤器,例如说SiteMesh和用户自定义过滤器等等, 最后到达Struts2的核心过滤器StrutsPrepareAndExecuteFilter,此时,StrutsPrepareAndExecuteFilter会去找ActionMapping看此Action路径是否存在,如果存在,则会参照Struts.xml文件产生Action的代理,并且执行Action,Struts2很多功能是靠拦截器完成的,所以这个Action代理真正调用Action的处理请求的方法的时候会经过拦截器1,2,3,才真正调用Action的方法,Action方法结束后会返回一个视图,视图也会去参照ActionMapping,还会参照Template(JSP,FreeMarker),此时,拦截器会再次拦截(说明Struts2的拦截器是进入Action和返回结果的时候都会拦截的,这比Filter好!),最后产生HttpServletResponse,相应结果!我们也看到了, 老版本上面, 我们需要的别的过滤器全部要放在Struts2的过滤器之前. 但是我现在有个需求: 我想在我的过滤器里面做一些事,需要Struts2的环境(ActionContext), 但是又需要在Struts2的Action执行之前. 这个时候, 老版本的那个过滤器就只能两眼望青天了.打个比方, 好比一个病人要做手术, 做手术需要打麻药(自定义过滤器)和动手术(Struts2的过滤器), 请问打麻药要怎么打呢? 不能让病人站着吧.. 所以首先要准备一个床(ActionContext), 之后打麻药, 再手术. 这也就是StrutsPrepareAndExecuteFilter真正的含义. 可以分成StrutsPrepareFilter,StrutsExecuteFilter, 如果没有像之前那样的需求,我们一般都用StrutsPrepareAndExecuteFilter就可以了.。
基于AOP理念的Struts2拦截器的研究与应用

中图 分 类 号 : P l T3】
文 献标 识 码 : A
文 章编 号 : 6 4 6 3 ( 0 0 0 一 0 8 0 17 — 26 2 1 ) l0 0 — 2
Re e r h a pp i a i n o r t 2 i t r e t r b s d o o o fAO P s a c nd a lc to fSt u s n e c p o a e n l g s o
安 全 验 证 、 日志 等 功 能往 往水 平 散 布 在 所 有 对 象 层 次 中 , 而
与 其 所 散 布 到 的 对象 核心 功能 没有 关 系 。这些 散 布 在各 处 的 代 码 被 称 为 横 切 代 码 , O P设 计 中 , 们 造 成 大 量 代 码 的 在 O 它 重 复 , 利 于各 个 模 块 的 复 用 。而 A P则 可 以 减 少 系统 中 的 不 O
n e e a d fe i lt fit r e t n s l i h r blm s ine n xbii o n e c pori o vngt e p o e . l y
Ke r s s e tO ine Po rmmig AOP) cos ut gc n en s a ;nec po y wo d :A p c— re td rga n( ; rsc tn o c r; w p itre tr i
增 多 和应 用 范 的扩 大 , 渐 暴 露 其 不 足和 局 限性 . 逐 . 比如一 个 系统 中有 几 十 个 或 几 百 个 数据 库 查 询 函数 .每 个 地 方 都 要
O P不 能 为 分 散 的对 象 引 入 公 共 行 为 。也 就 是 O P允许 定 O O
义 从 上 到 下 的关 系 , 并 不 适 合 定 义 从 左 到 的 关 系 。例 如 但
用拦截器实现访问权限控制

Struts自定义拦截器步骤(教材P100)
步骤1:建立Struts工程,编写Action和相应的页面 步骤2:自定义一个实现Interceptor接口的类,在
intercept方法中实现拦截器逻辑 步骤3:在struts.xml中为指定Action位置添加拦截
</boLeabharlann y>学习情境2 Struts2拦截器应用举例
步骤4:编写拦截器控制权限
拦截器取出Session中存入的状态码,判断用户身份
ActionContext ctx = invocation.getInvocationContext(); Map session = ctx.getSession(); String user = (String) session.get("username"); If(user!=null&&user.equals(“admin”)) return "admin";//进入管理页面 else{ ctx.put(“tip”, “您没有管理员的权限!”); //可用EL表达式语言取出 return “input”; //返回到登录页面 }
学习情境2 Struts2拦截器应用举例
步骤1:建立Struts工程,编写LoginAction和相应 的登录页面
在LoginAction中,若登录成功,在Session中写入 身份标志信息。
If(用户名密码正确) { ActionContext ctx = ActionContext.getContext(); Map session = ctx.getSession(); session.put("username" , getUsername());
软件开发框架(J2EE)Struts 2拦截器习题与答案

1.以下属于struts2的控制器组件是()。
A.ActionB.ActionFormC.ActionServletD.dispatchAction2.以下属于struts2的体系结构的是()。
A.struts2控制器组件B.struts2配置文件C.FilterDispathcerD.Action3.以下属于struts2配置文件中的配置元素是()。
A.<package>B.<action>C.<form-beans>D.<action-mappings>4.关于struts1和struts2对比的说法正确的是()。
A.Struts1要求Action类继承Struts1框架中的Action父类,Struts2中则不一定需要继承,可以是POJO类B.struts1中的Action不是线程安全的,而struts2中的Action是线程安全的C.struts1和struts2中都使用ActionForm对象封装用户的请求数据D.struts1使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值5.以下关于ValueStack说法正确的是()。
A.每个Action对象实例拥有一个ValueStack对象B.每个Action对象实例拥有多个ValueStack对象C.Action中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中D.ValueStack会在请求开始时被创建,请求结束时消亡6.关于struts2配置文件说法正确的是()。
A.必须在WEB-INF/classes目录下B.名字必须为struts.xmlC.配置Action时,必须配置包信息D.使用<forward>元素配置转发7.在struts2配置中用()元素来配置常量。
B.<constants>C.<constant>D.<constant-mapping>8.关于struts2包的说法正确的是()。
struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库第一篇:struts2拦截器--将用户操作日志存入数据库struts2拦截器--将用户操作日志存入数据库1.建表,如下所示:2.新建OperationLogModel.java,其具有上述属性。
3.自动生成PO4.在struts.xml中配置拦截器:5.如下例子中的用户登录和修改密码,要在相应xml文件中加入,即:indexchangePasswordPre6.在项目中新建文件夹log,在其下新建类LogInterceptor .java,如下:package com.bfw.crms.log; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import ng.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.bfw.crms.action.BulletinAction; import com.bfw.crms.action.SystemAction; import com.bfw.crms.model.EmployeeModel; import com.bfw.crms.model.OperationLogModel; import com.bfw.crms.po.OperationLog; import com.bfw.crms.util.BeanUtil; import com.bfw.crms.util.DateTimeUtil; import com.ninetowns.framework.dao.ObjectDao; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings("serial")public class LogInterceptor extends AbstractInterceptor{ private String logName;private String logContent;protected Logger log = Logger.getLogger(getClass()); protected HttpSession getSession(){return getRequest().getSession();}protected HttpServletRequest getRequest(){return ServletActionContext.getRequest();}public void init() {}private ObjectDao objectDao = null;public ObjectDao getObjectDao(){return objectDao;}public void setObjectDao(ObjectDao objectDao){this.objectDao = objectDao;}@Overridepublic String intercept(ActionInvocation ai) throws Exception {Object action= ai.getAction();String method= ai.getProxy().getMethod();try{if(StringUtils.isBlank(method)) method = "method";EmployeeModel sysUser (EmployeeModel)this.getSession().getAttribute("employee");String userName = "";if(sysUser!=null) userName = sysUser.getName();=String currentTime = DateTimeUtil.getDateTime();String logContentHead = "用户"+userName+currentTime;ai.invoke();//执行被拦截actionif (action instanceof BulletinAction) {if(method.equals("save")){logName = "保存部门";logContent = logContentHead+"保存部门:"+ai.getStack().findValue("Name");(logContent);addSysLog(logName,logContent);}if(method.equals("delete")){logName = "删除部门";logContent = logContentHead +""+((String[])(ai.getStack().findValue("flag_id"))).length+"条部门信息";(logContent);addSysLog(logName,logContent);}}if (actioninstanceof SystemAction) {if(method.equals("login")){logName = "登录系统";logContent = logContentHead;(logContent);addSysLog(logName,logContent);}if(method.equals("changePassword")){logName = "修改密码";logContent = logContentHead +"删除1条单位信息";(logContent);addSysLog(logName,logContent);}}}catch(Exception e){e.printStackTrace();}return Action.SUCCESS;}/*** 插入系统日志 model2po()* @param logName* @param logContent*/删除private void addSysLog(String logName,String logContent){ OperationLogModel operationModel = new OperationLogModel();OperationLog operationPO = new OperationLog();operationModel.setOperation(logContent);BeanUtil.model2po(operationModel, operationPO);this.getObjectDao().saveObject(operationPO);}} OK第二篇:Struts2中的拦截器与过滤器学习拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,response 提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do 的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。
Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。
在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。
⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。
2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。
Struts2的拦截器实现相对简单。
当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。
Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。
Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。
在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。
3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。
第⼆步:在配置⽂件中注册定义的拦截器。
第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。
4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。
4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。
(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。
struts2框架特征

struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。
本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。
一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。
这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。
在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。
二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。
这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。
例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。
这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。
三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。
开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。
拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。
同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。
四、数据验证在Web应用程序中,数据验证是一项重要的任务。
Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。
struts2面试题

struts2面试题Struts2是一个基于Java开发的Web应用程序框架,被广泛应用于企业级Java应用开发中。
在面试中,面试官可能会提出一些关于Struts2的问题,以评估应聘者的技术水平。
下面是一些常见的Struts2面试题及其详细答案,希望对你在面试中有所帮助。
1. 什么是Struts2?Struts2是一个轻量级的、基于MVC模式的Web应用程序框架。
它采用Java Servlet API和JavaServer Pages (JSP)技术,并提供了一种简单易用的方式来开发可维护和可扩展的Web应用程序。
2. Struts2的主要特性是什么?Struts2的主要特性包括:- MVC架构:将应用程序分为模型、视图和控制器,使开发更容易管理和扩展。
- 拦截器:通过拦截器可以在请求处理的各个阶段添加自定义的逻辑。
- 标签库:提供了丰富的标签库,简化了页面开发。
- 表单验证:提供了灵活且强大的表单验证机制,可以验证用户输入的数据。
- 国际化支持:支持多语言和本地化。
- 配置简单:通过配置文件来管理应用程序的行为。
3. Struts2的工作原理是什么?Struts2的工作原理如下:1) 客户端发送HTTP请求到服务器。
2) 服务器将请求交给Struts2的过滤器(Filter)。
3) 过滤器通过配置文件找到对应的Action,并调用相应的方法。
4) Action处理请求,并返回一个结果页面的名称或一个结果对象。
5) 结果页面的名称通过配置文件进行映射,服务器将其发送给客户端。
4. 什么是Struts2中的Action类?Action类是Struts2框架中的核心组件,用于处理Web请求。
一个Action类对应一个业务功能,其包含了要执行的方法和数据。
它负责接收请求、处理业务逻辑、将结果返回给前端页面。
5. Struts2中的拦截器是什么?有哪些内置的拦截器?拦截器是Struts2中的组件,用于在请求处理的各个阶段添加自定义的逻辑。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9
3.1.3 Struts2基本工作过程
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请 求 2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有 一个叫做ActionContextCleanUp的可选过滤器,这个过滤 器对于Struts2和其他框架的集成很有帮助,例如: SiteMesh Plugin); 3、接着StrutsPrepareAndExecuteFilter被调用, StrutsPrepareAndExecuteFilter询问ActionMapper来决定 这个请求是否需要调用某个Action; 4、如果ActionMapper决定需要调用某个Action, StrutsPrepareAndExecuteFilter把请求的处理交给 ActionProxy;
16
3.2.4 Struts2内置拦截器
Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在strutsdefault.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识; class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的strutsdefault包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。
•
注意:一旦继承了struts-default包(package),所有Action都会 默认调用拦截器栈 ---defaultStack。但是当在Action配置中加入 “<interceptor-ref name=”..“ />”则会覆盖defaultStack,所以在 action中写拦截器引用时,需要显示引用defaultStack(而且最好在 第一句)。
•
23
3.3.2 拦截器栈
•
拦截器栈配置完成后就可以在<action>中对其引用了,一个action引 用拦截器栈的格式如下:
<interceptors> <interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default"> <interceptors> <interceptor name="拦截器名1" class="拦截器类1"></interceptor> <interceptor name="拦截器名2" class="拦截器类2"></interceptor> ... <interceptor name="拦截器名n" class="拦截器类n"></interceptor> </interceptors> ...//action配置 </package> 21
Struts2 拦截器
1
课程结构
内容
第一章:Struts2入门 第二章:Struts2中的Action 第三章:Struts2拦截器 第四章:表达式语言OGNL 第五章:Struts2标签库 第六章:类型转换 第七章:国际化 第八章:文件上传和下载
课时(H)
3 6 3 3 3 3 3 3
第九章:校验框架
14
3.2.2 Struts2拦截器实现原理
拦截器围绕着Action和Result的执行而执行,其工作方式如上 图。 • 从图中可以看到,在Action和Result执行之前,为Action配置 的拦截器将首先被执行,在Action和Result执行之后,拦截器 将重新获得控制权,然后按照与先前调用相反的顺序依次执行 。在整个执行过程中,任何一个拦截器都可以选择直接返回, 从而终止余下的拦截器、Action和Result的执行。例如:当一 个未授权的用户访问受保护的资源时,执行身份验证的拦截器 可以直接返回。
<interceptor name="拦截器名" class="拦截器实现类 "> <param name="参数名">参数值</param> ...//如果需要传入多个参数,可以一并设置 </interceptor>
• •
20
3.3.1 拦截器的配置
•
如果在其他的拦截器配置中出现了同名的参数,则前面配置的参数将被 覆盖掉。 在struts.xml中可以配置多个拦截器,它们被包在 <interceptors></interceptors>之间,例如下面的配置:
10
3.1.3 Struts2基本工作过程
5、ActionProxy通过ConfigurationManager询问框架的配置文 件,找到需要调用的Action类; 6、ActionProxy创建一个ActionInvocation的实例。 7、ActionInvocation实例使用命名模式来调用,在调用Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。 8、一旦Action执行完毕,ActionInvocation负责根据 struts.xml中的配置找到对应的返回结果。返回结果通常是 (但不总是,也可能是另外的一个Action链)一个需要被表 示的JSP或者FreeMarker的模版。在表示的过程中可以使 用Struts2框架中继承的标签。在这个过程中需要涉及到 ActionMapper。
6
3.1.1 Struts2工作原理
•
配置文件
7
3.1.1 Struts2工作原理
8
3.1.2 Struts2核心组件
•
Struts2的Servlet过滤器StrutsPrepareAndExecuteFilter
•
•
ActionMapper
ActionProxy
•
•
ActionInvocation
</struts>
3.3.1 拦截器的配置
拦截器是配置在包下的。在包下配置了一系列的拦截器,但仅 仅是配置在该包下,并没有得到应用。如果要应用这些拦截器 ,就需要在<action>配置中引用这些拦截器, 格式为: <interceptor-ref name="…"> • 例子:
•
<action name="Action名" class="Action类">
11
第三章 Struts2拦截器
• 本章内容
3.1 Struts2工作原理 3.2 拦截器概述 3.3 拦截器的配置 3.4 自定义拦截器 3.5 自定义拦截器综合应用--权限验证
12
3.2.1 拦截器的概念
•
拦截器(Interceptor)是Struts2的核心组成部分。很多功能都是构建在 拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据 校验等,Struts2利用内建的拦截器,完成了框架内的大部分操作。 在Struts2文档中对拦截器的解释为--拦截器是动态拦截Action调用 的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块 ,这个模块可以在Action执行之前或者之后运行,也可以在一个 Action执行之前阻止Action执行。同时也提供了一种可以提取Action 中可重用的部分的方式。 拦截器是Struts2 更高层次的解耦,无须侵入框架本身便可以添加新 的功能。 拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层 通过动态代理模式完成。
24
3.3.3 默认拦截器
•
<default-interceptor-ref name=“…”>
<interceptor-ref name="拦截器1"></interceptor-ref> <interceptor-ref name="拦截器2"></interceptor-ref> </interceptor-stack> </interceptors> <action name="Action名" class="Action类"> <interceptor-ref name="myStack"></interceptor-ref> </action>
3
2
第三章:Struts2拦截器
目标: 本章旨在向学员介绍: 1)理解Struts2的工作原理 2)理解Struts2拦截器的工作方式 3)掌握拦截器的配置 4)会自定义拦截器
时间:3学时
教学方法:授课+练习
3
第三
3.1 Struts2工作原理 3.2 拦截器概述 3.3 拦截器的配置 3.4 自定义拦截器 3.5 自定义拦截器综合应用--权限验证