struts2中的token拦截器

合集下载

Struts2中的s标签 API Java Struts 程序开发

Struts2中的s标签 API Java Struts 程序开发
7. <s:autocompleter></s:autocompleter>-----自动完成<s:combobox>标签的内容,这个是ajax
B:
1. <s:bean name=""></s:bean>-----类似于struts1.x中的,JavaBean的值
C:
R:
1.
2. <s:radio list=""></s:radio>-----单选按钮
3. <s:reset></s:reset>-----重置按钮
S:
1. <s:select list=""></s:select>-----单选框
2. <s:set name=""></s:set>-----赋予变量一个特定范围内的值
4. <s:iterator></s:iterator>-----用于遍历集合
L:
1. <s:label></s:label>-----只读的标签
M:
1. <s:merge></s:merge>-----合并遍历集合出来的值
O:
数据标签:
action:直接调用一个Action,根据executeResult参数,可以将Action的处理结果包含到页面中。
bean:创建一个JavaBean实例。。
date:格式化输出一个日期属性。
debug:生成一个调试链接,当单击该链接时,可以看到当前栈值中的内容。

基于AOP理念的Struts2拦截器的研究与应用

基于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
义 从 上 到 下 的关 系 , 并 不 适 合 定 义 从 左 到 的 关 系 。例 如 但

strusts2课堂总结

strusts2课堂总结

一、1、struts2struts2是mvc设计思想的一个实现,可以将项目低耦合,提高扩展性2、struts2和struts1的区别struts2不是struts1的升级,而是继承的下xwork的血统,它吸收了struts1和webwork 的优势。

struts2的action是原型,安全的,struts2的action是单例,非安全3、步骤:1、导入包2、在web.xml文件中,加入struts2的核心拦截器3、在src下放入struts2的xml struts.xml4、urlhttp://localhost:8080/Struts2_01_HelloWorld/demo/hello.action二、1、默认值2、转发和重定向的区别转发:url显示的依然是上一个的url,共享上一次的请求重定向:url显示的是下一个的url,不共享3、urlhttp://localhost:8080/Struts2_02_Default/demo/hello.action4、路径http://localhost:8080/Struts2_02_Default/demo/a/b/c/hello.action1、原路径找不到,http://localhost:8080/Struts2_02_Default/demo/a/b/hello.action2、如果1找不到,http://localhost:8080/Struts2_02_Default/demo/a/hello.action3、如果2找不到,http://localhost:8080/Struts2_02_Default/demo/hello.action3、如果3找不到,http://localhost:8080/Struts2_02_Default/hello.action三、11、自定义action继承ActionSupport2、功能方法必须满足格式public String 名字()throws Exception{....};3、urlhttp://localhost:8080/Struts2_03_Action/demo/a.action四、1、如何给action传入参数注意:赋值的必须有封装的set方法,通过el表达式获取的时候,必须有封装的get 方法1、直接给单个参数赋值,在action里建立一个变量,名字与参数的名字一样2、为对象的某个属性赋值,在action里建立一个对象,将参数改为对象名.属性的格式五、1、转发和重定向的区别转发到下一次的时候,url依然是上一次的url,共享上一次的request重定向到下一次的时候,url是下一次的url,不共享上一次的request2、struts2的result的type转发:共享上一次action重定向:不共享上一次action1、转发到下一个jsp,html:dispatcher2、重定向到下一个jsp,html:redirect3、转发到下一个action:chain转到同一个包下的action转发到不同包下的action4、重定向到下一个action:redirectAction转到同一个包下的action转发到不同包下的action六、1、为了分模块开发,可以设置多个xmL文件。

Struts2标签使用

Struts2标签使用

Struts2标签使用(1):<s:textfield> ---- 文本输入框使用:<s:textfield name=”实体Bean。

属性”></s:textfield>(2):<s:textarea> ----- 文本域输入框使用:<s:textarea name=”实体Bean。

属性”></s:textarea>(3):<s:password> ----- 密码输入框使用:<s:password name=”实体Bean。

属性”></s:password>前三个基本都是一样的。

如果是要显示值的话可以这样:value = “实体Bean。

Get***()”。

(4):<s:radio list=””> ---- 单选按钮使用:<s:radio list=””>其中list 属性是必须要有的。

<1>:第一种方式:list = “#{‘male’:’男’,’female’:’女’}”<2>:第二中方式:list = “#request/session.list”。

---- 与action 结合起来了。

如果要默认选中的话后面加上value = “”.也可以通过javascript 的方式来默认选中。

(5):<s:url/> --- url连接<s:a/> --- 超链接这两个标签一般结合起来来使用。

使用:<s:url id = “id” action = “userAction”/><s:a href=”%{id}”/>(6):<s:form/> --- 获取相应form的值使用:<1>:<s:form action = “userAction”><2>:<s:url id=”userId” action = “userAction”> -- 定义了一个userId的指向userActionde 路径<s:form action=”%{userId}”>(7):<s:submit/> ---- 提交标签(8):<s:reset/> ---- 重置标签(9):<s:hidden/> ---- 隐藏域标签使用:<s:hidden name=”实体Bean。

paginationinnerinterceptor使用

paginationinnerinterceptor使用

paginationinnerinterceptor使用分页是在网站开发中非常常见的功能之一,可以帮助用户更方便地查看和导航大量的数据。

为了实现分页功能,我们通常会使用一些第三方的库或者插件,来简化开发过程。

而在Java开发中,Struts2框架提供了一个名为paginationinnerinterceptor的拦截器,可以很方便地实现分页功能。

paginationinnerinterceptor是Struts2框架中的一个拦截器,它的作用是拦截Action请求,并对分页参数进行处理。

使用paginationinnerinterceptor可以将分页参数直接映射到Action的属性上,从而实现分页功能。

下面我们来看一下如何使用paginationinnerinterceptor来实现分页功能。

首先,我们需要在Struts2的配置文件struts.xml中配置paginationinnerinterceptor。

我们可以定义一个全局的拦截器栈,在拦截器栈中添加paginationinnerinterceptor拦截器。

具体的配置如下所示:```xml<package name="default" namespace="/" extends="struts-default"><interceptors><interceptor-stack name="paginationStack"><interceptor-ref name="defaultStack" /><interceptor-ref name="paginationinnerinterceptor" /></interceptor-stack></interceptors><default-interceptor-ref name="paginationStack" />...</package>```接下来,我们需要在Action中定义用于接收分页参数的属性。

struts2 error处理

struts2 error处理

struts2 error处理Struts2错误处理可以通过以下几种方式进行处理:1. 全局异常处理器(Global Exception Handler):可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理所有的异常。

在struts.xml配置文件中添加如下内容:```xml<global-exception-mappings><exception-mapping exception="ng.Exception"result="error" /></global-exception-mappings>```2. Action级别的异常处理器:每个Action类可以通过实现`com.opensymphony.xwork2.Action`接口,并定义`execute()`方法来处理特定的异常。

在struts.xml配置文件中,为每个使用自定义处理器的Action配置异常处理器:```xml<action name="example" class="com.example.ExampleAction"> <exception-mapping exception="ng.Exception"result="error" /><result name="error">/error.jsp</result><result>/example.jsp</result></action>```3. 拦截器异常处理器:Struts2中的拦截器可以捕获并处理Action方法中的异常。

可以通过自定义拦截器来实现异常处理,然后在struts.xml配置文件中使用:```xml<action name="example" class="com.example.ExampleAction"><interceptor-ref name="exceptionInterceptor" /><result>/example.jsp</result></action>```以上是Struts2错误处理的几种典型方法,可以根据具体需求选择适合的方式进行处理。

Struts2的配置文件详解

Struts2的配置文件详解
Struts2的命名空间的作用等同于struts1里模块的作用。
1.3.包含配置:
在Struts2中可以将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。
<struts>
<includefile="struts-default.xml"/>
<includefile="struts-user.xml"/>
erName= userName;
}
/**
*@returnthepassword
*/
publicString getPassword() {
returnpassword;
}
/**
*@parampasswordthepasswordtoset
*/
publicvoidsetPassword(String password) {
</action>
</package>
</struts>
如上示例的配置,配置了一个名为default的包,该包下定义了一个Action。
1.2.命名空间配置:
考虑到同一个Web应用中需要同名的Action,Struts2以命名空间的方式来管理Action,同一个命名空间不能有同名的Action。
Struts2通过为包指定namespace属性来为包下面的所有Action指定共同的命名空间。
l public Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。
l public void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。

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中的组件,用于在请求处理的各个阶段添加自定义的逻辑。

Struts2的拦截器配置

Struts2的拦截器配置

拦截器实例
public class SimpleInterceptor extends AbstractInterceptor { private String name; public void setName(String name) { = name; } public String intercept(ActionInvocation invocation) throws Exception { LoginAction action = (LoginAction)invocation.getAction(); ......... String result = invocation.invoke(); ...... return result; } }
Struts 专题篇
第九章 Struts 2 的拦截器 主讲:陈宝峰
内容描述
● ● ● ● ● ●
拦截器概述 拦截器配置 使用拦截器的配置 使用默认拦截器的配置 拦截器实例 方法过滤
拦截器概述
● ●
拦截器是 Struts 2 中的重要组成部分 大量的内建拦截器完成了大部分的 Struts2 框架的工作
结束
使用默认拦截器的配置
<package name=” 包名” > <interceptors> <interceptor name=” 拦截器名 1” class=”......” /> ...... <interceptor-stack name=” 拦截器栈名 1”> <interceptor-ref name=” 拦截器名 1” /> ...... </interceptor-stack> </interceptors> <default-interceptor-ref name=” 拦截器名或拦截器栈名” /> <action ...... /> </package>

Struts2考试题分析

Struts2考试题分析

题目1以下不属于Struts2中result的type属性()A.actionB.redirectC.redirectActionD.dispatcher题目2下列有关拦截器说法错误的是?A。

struts通过拦截器完成执行action请求处理方法前一系列操作。

例如:数据封装、文件上传、数据校验等B。

在struts中,直接访问jsp页面,struts将使用默认拦截器栈处理当前请求。

C。

在执行action时,struts将执行若干拦截器1、2、3,执行action完成后,将继续执行拦截器3、2、1D。

默认情况,在一个action没有配置拦截器的引用,说明当前action将不使用拦截器题目3以下哪些是Action接口提供的返回值?A。

successB.noneC。

errorD.input题目4如果要实现struts2的数据检验功能A普通的Action类可以实现B继承自Action接口的可以实现C继承自ActionSupport类可以实现D继承自ActionValidate类可以实现题目5struts2默认的处理结果类型是:A。

dispatcherB。

redirectC.chainD.forward题目6在值栈的上下文Context中,存在一些固定的key表示不同的对象,以下描述正确的是?A。

request,表示request作用域的数据B。

session,表示session作用域的数据C.application,表示application作用域的数据D。

parameters,表示请求参数的所有数据题目7以下属于struts2配置文件中的配置元素是:()多选)A.〈package〉B.<action〉C.<form—beans〉D.〈action—mappings>题目8有关值栈 context Map栈数据操作描述正确的是?A.ActionContext.getContext()。

put(key,value)直接对context进行操作B。

struts2拦截器拦截指定方法

struts2拦截器拦截指定方法

import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/**拦截指定方法*/public class MyFilterInterceptor extends MethodFilterInterceptor{private static final long serialVersionUID = 1L;private String name;public void setName(String name){ = name;}@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception { //取得请求相关的ActionContext实例ActionContext ctx = invocation.getInvocationContext();Map session = ctx.getSession();//取出名为user的Session属性String user = (String)session.get("user");//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆if (user != null && user.equals("scott") ){return invocation.invoke();}//没有登陆,将服务器提示设置成一个HttpServletRequest属性ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");//直接返回login的逻辑视图return Action.LOGIN;}}2.struts.xml配置<package name="site" extends="struts-default" namespace="/site"><interceptors><!-- 定义了一个名为authority的拦截器--><interceptor name="authority" class="cn.zgcyx.filter.MyFilterInterceptor"/> <!--上面自定义的拦截器类--><interceptor-stack name="myDefault"><interceptor-ref name="authority"> <!-- 引用拦截器--><param name="includeMethods">getALL,getPart,listUser</param> <!-- 设置需要拦截的方法,多个以逗号隔开--></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><default-interceptor-ref name="myDefault"></default-interceptor-ref><!-- 全局--><global-results><!-- 当返回login视图名时,转入/login.jsp页面--><result name="login">/login.jsp</result></global-results><action name="site" class="siteServiceAction"><!--省略跳转--></action></package>。

自定义拦截器实现防止重复提交

自定义拦截器实现防止重复提交

由于struts2标签的性能不好,项目组决定不使用,但是如果用struts2自带的拦截器防止重复提交又必须struts标签,所以只好自定拦器实现,具体步骤如下:新建拦截器类:public class TokenAtionInterceptor extends AbstractInterceptor {public String intercept(ActionInvocation invocation) throws Exception {Map<String, Object> session =invocation.getInvocationContext().getSession();HttpServletRequest request = ServletActionContext.getRequest();String strGUID = RandomGUIDUtil.newGuid();//生成令牌String strRequestToken = (String)session.get("request_token");//取出会话中的令牌String strToken = request.getParameter("token"); //页面中的令牌if(strRequestToken != null&& !strRequestToken.equals(strToken)){ //重复提交,重置令牌session.put("request_token", strGUID);request.setAttribute("token", strGUID);return"invalidToken";}session.put("request_token", strGUID);request.setAttribute("token", strGUID);return invocation.invoke(); //否则正常运行}}建一个生成令牌的工具类:public class RandomGUIDUtil extends Object {/**日志管理类对象*/private Logger logger= Logger.getLogger(this.getClass().getName());public String valueBeforeMD5 = "";public String valueAfterMD5 = "";private static Random myRand;private static SecureRandom mySecureRand;private static String s_id;/** 静态块初始化*/static {mySecureRand = new SecureRandom();long secureInitializer = mySecureRand.nextLong();myRand = new Random(secureInitializer);try {s_id = InetAddress.getLocalHost().toString();} catch (UnknownHostException e) {System.out.println("构造带指定详细消息和嵌入异常!");}}public RandomGUIDUtil() throws Exception {getRandomGUID(false);}public RandomGUIDUtil(boolean secure) throws Exception { getRandomGUID(secure);}/** 随机生成GUID*/private void getRandomGUID(boolean secure) throws Exception { MessageDigest md5 = null;StringBuffer sbValueBeforeMD5 = new StringBuffer();try {md5 = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {logger.error("初始化MD5出错!");throw new NoSuchAlgorithmException("初始化MD5出错!");}try {long time = System.currentTimeMillis();long rand = 0;if (secure) {rand = mySecureRand.nextLong();} else {rand = myRand.nextLong();}sbValueBeforeMD5.append(s_id);sbValueBeforeMD5.append(":");sbValueBeforeMD5.append(Long.toString(time));sbValueBeforeMD5.append(":");sbValueBeforeMD5.append(Long.toString(rand));valueBeforeMD5 = sbValueBeforeMD5.toString();md5.update(valueBeforeMD5.getBytes());byte[] array = md5.digest();StringBuffer sb = new StringBuffer();for (int j = 0; j < array.length; ++j) {int b = array[j] & 0xFF;if (b < 0x10) sb.append('0');sb.append(Integer.toHexString(b));}valueAfterMD5 = sb.toString();} catch (Exception e) {logger.error("获得MD5加密码出错!");throw new Exception("初始化MD5出错!");}}/***生成一个GUID串*@return GUID*@throws Exception*/public static String newGuid() throws Exception{ RandomGUIDUtil rdmGUID = new RandomGUIDUtil();return rdmGUID.toString();}/** 生成以主机串号、显卡串号、主板号,以保证唯一性的32位编码*/public String toString() {String raw = valueAfterMD5.toUpperCase();StringBuffer sb = new StringBuffer();sb.append(raw.substring(0, 8));sb.append(raw.substring(8, 12));sb.append(raw.substring(12, 16));sb.append(raw.substring(16, 20));sb.append(raw.substring(20));return sb.toString();}}在struts配置文件中对应的包下定义拦截器,注意顺序,package里元素必须按照一定的顺序排列。

struts2异常拦截处理

struts2异常拦截处理

struts2异常拦截处理在实际开发中,我们需要将捕获的异常信息打印出来,换上通俗的语言让客户能够大概了解是原因引起的异常,所以我们需要将异常信息显示到页面上来,让客户能够看得见。

这里介绍以下struts2的异常处理机制。

在sturts2的struts-default.xml中,引用了struts2定义的拦截器:<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/下面是一个小例子来说明struts2中,应该如何捕获异常信息,并将异常信息显示到页面:一个简单的index.jsp页面,只有一个按钮,点击进入action:<s:form action="login"><s:submit value="submit"/></s:form>struts.xml的配置:<struts><package name="Action" extends="struts-default"><global-results><result name="all">/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="all" exception="ng.Exception"></exception-mapping></global-exception-mappings><action name="login" class="com.action.LoginAction"><result name="success">/success.jsp</result></action></package></struts>Action:public class LoginAction extends ActionSupport {@Overridepublic String execute() throws Exception {try{int i = 9/0;}catch (Exception e) {throw new Exception(e);}return "success";}}打印错误信息的页面 error.jsp:<body><s:property value="exception.message"/></body>这样就可以把异常信息打印到指定的页面,当然也可以在struts.xml中定义局部的异常映射信息。

struts token 机制学习理解

struts token 机制学习理解

struts2中使用token避免重复提交1.在struts.xml中<action name="register" class="org.sunxin.struts2.action.RegisterAction"><!-- 配置异常映射,当RegisterAction抛出Exception异常时,向用户显示error.jsp页面--><exception-mapping result="error" exception="ng.Exception"/><result name="input">/pages/register.jsp</result><result name="success">/pages/success.jsp</result><result name="error">/pages/error.jsp</result><result name="invalid.token">/pages/register.jsp</result><result name="wait">wait.jsp</result><interceptor-ref name="defaultStack"></interceptor-ref><interceptor-ref name="token"><param name="excludeMethods">input</param></interceptor-ref></action>2.在页面中加<s:actionerror/><s:form action="register" method="post"><s:token></s:token></s:form>3.<interceptor-ref name="token"/><interceptor-ref name="token-session"/><!--注意struts2.0 拦截器名字为token-session struts2.1.2 已经更改为tokenSession -->token: 在活动中检查合法令牌(token), 防止表单的重复提交; 在<s:actionerror/>会产生提示信息token-session: 同上, 但是在接到非法令牌时将提交的数据保存在session中; 不会在<s:actionerror/>会产生提示信息只会在后台发出警告并处理,如下:警告: Form token KO80SIJW4F84034NG5HM1ZBUGOVNY64D does not match the session token null.编辑特别推荐:为struts1.2增加token标签令牌标签[修改更新 2009-07-28 修复了一个BUG]2009-07-23 17:282009-07-28更新提醒:修改了一个页面不能存在多个表单的BUGpackage com.tgmsp.CongZhong.tag;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;import org.apache.struts.Globals;import org.apache.struts.taglib.html.Constants;import org.apache.struts.util.TokenProcessor;public class TokenTag extends TagSupport {public int doEndTag() throws JspException {HttpServletRequest request =(HttpServletRequest)pageContext.getRequest();JspWriter out = pageContext.getOut();try {Object tmp = null;String token = (tmp =request.getSession().getAttribute(Globals.TRANSACTION_TOKEN_KEY))==nu ll?TokenProcessor.getInstance().generateToken(request):tmp.toString() ;if (token != null) {request.getSession().setAttribute(Globals.TRANSACTION _TOKEN_KEY, token);out.println("<input type=\"hidden\"name=\""+Constants.TOKEN_KEY+"\" value=\""+token+"\"/>");}} catch (IOException e) {e.printStackTrace();}return this.EVAL_PAGE;}}....标签配置部分<tag><name>token</name><tagclass>com.tgmsp.CongZhong.tag.TokenTag</tagclass><bodycontent>empty</bodycontent><info><![CDATA[保存Struts令牌org.apache.struts.action.TOKEN<congzhong:token/>]]></info></tag>....实例一:防止表单重复提交防止重复提交:有两种方法:一是使用token拦截器,二是使用tokenSession第一种方法步骤:1、先在页面中放一个令牌。

Struts2-interceptor

Struts2-interceptor

Struts2拦截器一、什么是拦截器?1、拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。

它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。

同时也是提供了一种可以提取action 中可重用的部分的方式。

2、拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。

拦截器链就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

3、如何使用struts2拦截器,或者自定义拦截器。

特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/>(必须加,否则出错)4、也可以改为对全局Action设置自己需要的拦截器,如下:在struts.xml里面定义全局的配置设置<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)</package>struts-action.xml里面配置Action如下:<package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)<action name="logon" class="logonAction"><result>/jsp/smeishop/admin/index.jsp</result> <resul t name="error">/jsp/smeishop/admin/logon.jsp</result><result name="input">/jsp/smeishop/admin/logon.jsp</result> </action><action name="logout" class="logoutAction"><result>/jsp/smeishop/admin/logon.jsp</result></action></package>二、Struts2自带的配置及其拦截器配置1、Struts2 拦截器 [Interceptor]拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

基于struts2拦截器的操作日志系统设计

基于struts2拦截器的操作日志系统设计
C A 1 H R( )
CA ( ) H
是 台 记 录 操 作 日志 ,0表 不 小 记
_
l g s t r ( u h g t c i n ( ) o .eU l a t. eA to ):
l g. et p o s l
(e veA t oC n et gt eu s ( .eR m tA d ( ) Sr lt c in ot x. eR q et ) gt eo ed r ); d o s v ( o ) a .a e 1g :

40 0 ) 3 2 5
要 :操 作 日志是 各种 应 用 系统非 常重 要 的一部 分 ,它记 录 了用户在 系统 中进行 的操 作 ,为 系统 管理 者进 行 审计跟
踪提 供 了数 据 支撑 。本 文介 绍一种 基 于 sus tt r 2拦截 器模 式 的操作 日志 系统设 计 ,它在 实现 操作 日志记 录的 同时 ,以极其 优 雅及 简洁 的方 式降低 了业务逻 辑 与操 作 日志记 录之 间的耦舍 性 ,是 实现 操作 日志的理 想 选择 。 关键 词 :操 作 日志 系统 ;拦 截 器 ;sus;业务逻 辑 tt r 2



h ^ ) t ^

t .1 L
p b s a i a < t i g, y A t a t o > a a : n w u l c t t c M p S r n S s u h c i n i Mp e
p v e t ti A h Aut a i n ut = n 0 ri at s a c ut h ct o a h ul n 1:
SP 0 D V RH R (0 U 1R I A C A 2 2 )

struts2-2拦截器与SiteMesh

struts2-2拦截器与SiteMesh

Softeem Consultancy Service
拦截器的初始化方法
Softeem Consultancy Service
<interceptors> <interceptor name="authority" class="com.softeem.struts.interceptor.AuthorityInterceptor“ <package name=“boke" extends="struts-default"> </interceptor> <interceptors> <interceptor-stack name="appStack"> <interceptor name="authority" <interceptor-ref name="authority" /> class=“softeem.AuthorityInterceptor"/> <interceptor-ref name="defaultStack" /> </interceptors> </interceptor-stack> <global-results> </interceptors> <result name="login">/login.jsp</result> <action name="book_*" </global-results> class="com.softeem.struts.book.BookAction" <action name=“boke“ class=“softeem.BokeAction”> method="{1}"> <result>/WEB-INF/jsp/viewBook.jsp</result> <result>{1}.jsp</result> <!-- 拦截器一般配置在 拦截器一般配置在result元素之后 --> 元素之后! 元素之后 <result name="toAction" type="redirect">book_list.action <interceptor-ref name="authority"/> </result> </action> <interceptor-ref name="appStack"></interceptor-ref> </package> </action>

struts2_异常处理

struts2_异常处理

Struts2___异常处理Struts2提供声明式的异常处理方式,内部通过配置的拦截器来实现,默认异常拦截器:com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor这样我们不需要在Action方法中catch异常,只需抛出相关的异常,都交由拦截器处理通过异常映射配置:<exception-mapping>元素exception属性:指定该异常映射所设置的异常类型result属性:指定Action出现该异常时,跳转到result属性所指向的结果异常映射类别分为两种:局部异常映射:<exception-mapping>配置<action name="exceptionAction"class="org.struts2.ch6.action.ExceptionAction"> <!-- 局部异常映射当Action 抛出指定异常时显示名为book_error指定的页面--><exception-mapping result="book_error"exception="ng.IllegalArgumentException"/><result>/ch6/book_add.jsp</result><result name="book_error">/ch6/book_error.jsp</result></action>全局异常映射:<global-exception-mappings>和<exception-mapping>配置<global-results><result name="error">/ch6/error.jsp</result></global-results><global-exception-mappings><exception-mapping result="error"exception="ng.Exception"/> </global-exception-mappings>页面输出异常信息:异常对象被封装成ExceptionHolder对象,压入ValueStack中<s:property value="exception.message"/> 输出异常对象消息<s:property value="exceptionStack"/> 输出异常堆栈信息Struts2 拦截器工作原理UML时序图:Struts2___类型转换◆内置的类型转换Stringboolean/Booleanchar/Characterint/Integer,float/Float,long/Long,double/Double date 默认时间格式为yyyy-MM-dd(当前时区的SHORT格式)数组假设每个单独的字符串都能转换成数组中元素的类型集合如果不能确定集合中元素的类型,会默认是String类型,并创建一个新的ArrayList对象◆自定义类型转换器主要方式:a.继承DefaultTypeConverter,重写convertValue方法b.继承StrutsTypeConverter,重写convertFromString和convertToString方法(推荐)public class DateTypeConverter extends StrutsTypeConverter {private String[] pattern = {"yyyy-MM-dd HH:mm:ss","yyyy/MM/dd HH:mm:ss","yyyy-MM-dd","yyyy/MM/dd"};private SimpleDateFormat sdf=new SimpleDateFormat();/*** @param context action上下文* values[] 需要转换的String数组* toClass 转换后的目标类型** @return返回转换后的目标对象*/public Object convertFromString(Map context, String[] values, Class toClass) { /** 使用指定的日期格式解析字符串值,返回Date对象*/Date date=null;if(toClass==Date.class && values.length>0){if(values[0]!=null && !"".equals(values[0])){System.out.println("接收的参数值:"+values[0]);date=parse(values[0]);if(date==null){/** 解析出现异常,抛出TypeConversionException异常,以通知Struts2发生了转换错误*/System.out.println("抛出类型转换异常,通知struts处理");throw new TypeConversionException("类型转换异常");}}System.out.println("转换后的值:"+date);return date;}return null;}public String convertToString(Map context, Object o) {/**使用指定的日期格式格式化Date对象,返回字符串*/return sdf.format(o);private Date parse(String source) {for(String fmt:pattern){Date d=convert(source,fmt);if(d!=null){return d;}}return null;}private Date convert(String source, String fmt) { try {sdf.applyPattern(fmt);Date v = sdf.parse(source);return v;}catch (ParseException e) {return null;}}自定义类型转换器的注册方式:A、局部类型转换器:针对某个ActionB、全局类型转换器:针对所有ActionC、使用JDK1.5的注释1.局部类型转换器提供如下格式的properties 文件,存放在Action类同一路径下文件名:action类名-conversion.properties内容: Action属性名=转换器全路径类名如:birthday=org.struts2.ch6.conversion.DateTypeConverter2、全局类型转换器(一般使用)提供如下格式的文件,存放位置:WEB-INF/classes/目录下文件名: xwork-conversion.properties内容:需要转换的全路径的类名=转换器全路径类名如:java.Util.Date=org.struts2.ch6.conversion.DateTypeConverter 类型转换的流程(String转对应类型)类型转换异常提示处理类型转换由conversionError拦截器处理出错返回input指向页面使用<s:fielderror/>显示错误信息##默认类型转换错误消息(一般使用) 一般定义在全局资源包文件中xwork.default.invalid.fieldvalue=this.field{0}value invalid ##局部类型转换错误消息显示(一般定义action级别资源包)invalid.fieldvalue.属性名=错误提示invalid.fieldvalue.birthday=birthday convert error!!!示例参见ch6。

Struts2 中拦截器和Action的调用关系

Struts2 中拦截器和Action的调用关系
<!--注意,每一个action都有一个默认的拦截器,如果指定了自定义的拦截器,那么默认的拦截器就失去作用了,所以这里要再加上默认的拦截器-->
</action>
<action name="action2" class="com.suo.actions.Action2">
this.password = password;
}
public String execute()
{
System.out.println("action2 invoke !");
return SUCCESS;
}
public String execute()
{
System.out.println("action1 invoke !");
return SUCCESS;
}
}
复制代码
复制代码
Action2.java:
public class MyInterceptor implements Interceptor {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy invoke !");
}
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("init invoke !");

Struts2默认拦截器解析

Struts2默认拦截器解析

Struts2默认拦截器解析使用struts2,拦截器大家经常使用,当然默认情况我们除了自定义的拦截器外,会使用struts2默认的拦截器,那他究竟有哪些默认的拦截器?每个拦截器都是做什么的呢?我们来看下对应的源码,打开对应源码下的struts2-default.xml文件我们可以看到对应很多的拦截器信息,如下<interceptors><interceptor name="alias"class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/><interceptor name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInt erceptor"/><interceptor name="chain"class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorIntercepto r"/><interceptor name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/><interceptor name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/> <interceptor name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /><interceptor name="externalRef"class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/><interceptor name="execAndWait"class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptor name="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingIntercepto r"/><interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n"class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/><interceptor name="logger"class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/><interceptor name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="sessionAutowiring"class="org.apache.struts2.spring.interceptor.SessionContextAutowiring Interceptor"/><interceptor name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/><interceptor name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidation Interceptor"/><interceptor name="workflow"class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor "/><interceptor name="store"class="org.apache.struts2.interceptor.MessageStoreInterceptor"/> <interceptor name="checkbox"class="org.apache.struts2.interceptor.CheckboxInterceptor"/><interceptor name="profiling"class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /><interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor"/> <!-- Deprecated name forms scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 --><interceptor name="external-ref"class="com.opensymphony.xwork2.interceptor.ExternalReferencesIntercep tor"/><interceptor name="model-driven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="static-params"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scoped-model-driven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="servlet-config"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/><!-- Basic stack --><interceptor-stack name="basicStack"><interceptor-ref name="exception"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="checkbox"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/></interceptor-stack><!-- Sample validation and workflow stack --><interceptor-stack name="validationWorkflowStack"><interceptor-ref name="basicStack"/><interceptor-ref name="validation"/><interceptor-ref name="workflow"/></interceptor-stack><!-- Sample file upload stack --><interceptor-stack name="fileUploadStack"><interceptor-ref name="fileUpload"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample model-driven stack --><interceptor-stack name="modelDrivenStack"><interceptor-ref name="modelDriven"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample action chaining stack --><interceptor-stack name="chainStack"><interceptor-ref name="chain"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample i18n stack --><interceptor-stack name="i18nStack"><interceptor-ref name="i18n"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- An example of the params-prepare-params trick. This stack is exactly the same as the defaultStack, except that itincludes one extra interceptor before the prepare interceptor:the params interceptor.This is useful for when you wish to apply parameters directlyto an object that you wish to load externally (such as a DAOor database or service layer), but can't load that objectuntil at least the ID parameter has been loaded. By loadingthe parameters twice, you can retrieve the object in theprepare() method, allowing the second params interceptor toapply the values on the object. --><interceptor-stack name="paramsPrepareParamsStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="params"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><!-- A complete stack with all the common interceptors in place.Generally, this stack should be the one you use, though itmay do more than you need. Also, the ordering can beswitched around (ex: if you wish to have yourservlet-relatedobjects applied before prepare() is called, you'd need to moveservlet-config interceptor up.This stack also excludes from the normal validation and workflowthe method names input, back, and cancel. These typically areassociated with requests that should not be validated.--><interceptor-stack name="defaultStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="debugging"/><interceptor-ref name="profiling"/><interceptor-ref name="scopedModelDriven"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"><param name="excludeParams">dojo\..*</param></interceptor-ref><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack><!-- The completeStack is here for backwards compatibility for applications that still refer to the defaultStack by theold name --><interceptor-stack name="completeStack"><interceptor-ref name="defaultStack"/></interceptor-stack><!-- Sample execute and wait stack.Note: execAndWait should always be the *last* interceptor. --><interceptor-stack name="executeAndWaitStack"><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="defaultStack"/><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><default-interceptor-ref name="defaultStack"/>是配置对应的拦截器栈,下面我们来看对应的拦截器栈都有哪些?都是做什么的?如果不配置拦截器,默认使用他自己的defaultStack,我们看到,defaultStack包含了基本上所有的拦截器,所以基本上都能满足我们的需求,但是我们一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,所以我们可以根据不通的场景,选择合适的拦截器栈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

提交表单时,可能出现这样的情况,如果上次提交成功,按浏览器的返回按钮,再提交一次会出现同一份数据提交两次的情况。

如果这份表单不幸两次写入数据库,可能会产生问题。

Struts2提供两个拦截器来组织这种用户无意的行为可能导致的重复提交问题。

实现过程
1.在提交的表单中,添加<s:token/>标记
2.配置TokenInterceptor或TokenSessionInterceptor
3.配置invoke.token结果,决定如果遇到重复提交时需要返回的页面。

另外可以再struts.properties文件中提供struts.messages.invalid.token键值决定如果发生Token的错误信息。

TokenInterceptor实现原理
<s:token />标记的作用是在显示表单页面时,服务器(由TokenHelper类实现)会生产一个唯一的令牌键值对,并在提交表单时发送给服务器。

服务器会检测客户端提交的令牌和缓存的令牌进行比较,如果是有效的则清除服务器端缓存并继续处理,如果是无效的,则返回invalid.token结果(通常显示一个提示页面)。

TokenSessionStoreInterceptor实现原理
TokenSessionStoreInterceptor扩展自TokenInterceptor,改写了处理无效令牌的机制,不是返回一个invalid.token结果,而是返回上一次成功提交后的结果页面,这是如何做到的呢?
TokenSessionStoreInterceptor会针对每次拦截成功执行的ActionInvocation根据令牌的键值为标识符进行缓存,如果发送重复提交,则取出缓存的ActionInvocation中的Result对象返回。

ExecuteAndWaitInterceptor
此拦截器主要目的是给一些长任务请求更好的用户体验,在长任务执行过程中显示给用户一个等待页面,可以通过配置wait结果页面提供一个自定义的等待页面,否则框架将提供一个缺省的比较丑陋的等待页面。

注意:
此拦截器必须放在拦截器堆栈的最后。

此拦截器会基于会话的,这意味着同一个会话中同时只能执行一个此请求
实现原理
1.拦截器会将当前请求包装在一个后台线程中执行(由BackgroundProcess类实现)。

2.在后台线程执行的过程中,拦截器会每隔100微妙检查一下,后台线程是否结束执
行结束。

3.如果在制定的延迟后,后台线程依然没有结束,将返回一个等待页面。

4.如果在指定的延迟后,后台线程运行结束,将返回请求的结果页面。

注意:
因为Action运行在一个后台进程,action无法使用ActionContext,因为ActionContext 是线程本地的。

如果必须访问比如会话数据,你必须让Action实现SessionAware 接口,而不是调用ActionContext.getSession方法。

相关文档
最新文档