Struts2之拦截器篇

拦截器是Struts2框架的核心和基础,Struts2绝大多数功能都是通过拦截器来完成的,当StrutsPrepareAndExecuteFilter拦截到用户请求后,大量拦截器会对该请求进行处理,然后才调用用户自定义的Action类中的方法进行处理请求,由此可见,拦截器是Struts2的核心所在。

Struts2框架内建了大量的拦截器,我们可以在struts-default.xml中进行查看:

那么这些内置拦截器的具体作用是什么呢?

   


alias


实现在不同请求中相似参数别名的转换


autowiring


这是个自动装配的拦截器,主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的 Bean


chain


构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type="chain" .../>一起使用


conversionError


这是一个负责处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误


createSession


该拦截器负责创建一个HttpSession对象,主要用于那些需要有HttpSession对象才能正常工作的拦截器中


debugging


当使用Struts2的开发模式时,这个拦截器会提供更多的调试信息


execAndWait


后台执行Action,负责将等待画面发送给用户


exception


这个拦截器负责处理异常,它将异常映射为结果


fileUpload


这个拦截器主要用于文件上传,它负责解析表单中文件域的内容


i18n


这是支持国际化的拦截器,它负责把所选的语言、区域放入用户Session中


logger


这是一个负责日志记录的拦截器,主要是输出Action的名字


model-driven


这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel()方法的结果堆入ValueStack中


params


这是最基本的一个拦截器,它负责解析HTTP请求中的参数,并将参数值设置成Action对应的属性值


prepare


如果action实现了Preparable接口,将会调用该拦截器的prepare()方法。
  static-params: 这个拦截器负责将xml中<action>标签下<param>标签中的参数传入action


scope


这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内


servlet-config


如果某个Action需要直接访问Servlet API,就是通过这个拦截器实现的。
注意:尽量避免在Action中直接访问Servlet API,这样会导致Action与Servlet的高耦合


 roles


这是一个JAAS(Java Authentication and Authorization Service,Java授权和认证服务)拦截器,只有当浏览者取得合适的授权后,才可以调用被该拦截器拦截的Action


timer


这个拦截器负责输出Action的执行时间,这个拦截器在分析该Action的性能瓶颈时比较有用。


token


这个拦截器主要用于阻止重复提交,它检查传到Action中的token,从而防止多次提交。


 token-session


这个拦截器的作用与前一个基本类似,只是它把token保存在HttpSession中


 validation


通过执行在xxxAction-validation.xml中定义的校验器,从而完成数据校验


workflow


这个拦截器负责调用Action类中的validate方法,如果校验失败,则返回input的逻辑视图


scoped-model-driven


如果一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定生存范围中找出指定的Modol,并将通过setModel方法将该Model传给Action实例

接下来我们以token这一内置的拦截器为例来看看Struts2中拦截器的应用(token拦截器用来处理用户重复提交的页,以防止错误发生):

首先配置struts开发环境,上一篇:Struts2框架基础篇  中有介绍,这里不重复说。

写一个登录页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>Login</title>
  </head>

  <body>
    <s:form action="login" method="post">
    	<s:token></s:token>
    	<s:textfield name="username" label="username"></s:textfield>
    	<s:password name="password" label="password"></s:password>
    	<s:submit value="login"></s:submit>
    </s:form>
  </body>
</html>

编写action:

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{

	private static final long serialVersionUID = 7222063566979612268L;
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

}

接着在struts.xml中配置action及拦截器:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 配置struts可以受理的请求扩展名 ,这是默认的-->
<constant name="struts.action.extension" value="action,,"></constant>
	<package name = "hello" extends = "struts-default" namespace = "/">
		<action name="login" class="org.interceptor.LoginAction">
			<result>/success.jsp</result>
			<result name="invalid.token">/error.jsp</result>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<!-- defaultStack 是系统默认的拦截器栈,会自动应用,这里手动配置的原因是当为一个action配置拦截器
			时,默认的拦截器就不起作用了,所以必须显示的配置这个拦截器栈 -->
			<interceptor-ref name="token"></interceptor-ref>
		</action>
	</package>
</struts>

最后,为了测试,编写一个成功界面以及重复提交被拦截界面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>welcome</title>
  </head>

  <body>
  	欢迎<s:property value="username"/>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>wrong</title>
  </head>

  <body>
  	请不要重复提交
  </body>
</html>

测试运行:

输入用户名密码:

点击login:

刷新或者返回再次点击login,此时的操作会被拦截器拦截:

这样,用内置拦截器比较容易的就解决了表单重复提交的问题。

时间: 2024-12-29 12:43:31

Struts2之拦截器篇的相关文章

[转载]难经3:Struts2,拦截器拦不住Result?

[问题] 使用Struts2作为web框架,知道它的拦截器(Interceptor)机制,类似与Filter和spring的AOP,于是实现了一个为Action增加自定义前置(before)动作和后置动作(after)的拦截器(曰:WInterceptor),不过用一段时间发现,在WInterceptor的after中,对Action对象的属性修改在页面看不到,对请求对象的属性设置也无效.为什么在调用了Action之后(invokeAction())之后,request就不能使用了呢,拦截器不能

struts2整合spring3后,指定spring管理action之后,配置的struts2的拦截器,拦截不到东西

问题描述 struts2整合spring3后,指定spring管理action之后,配置的struts2的拦截器,拦截不到东西 struts2整合spring3后,指定spring管理action之后,配置的struts2的拦截器,拦截不到东西,这是什么原因??? Struts2的Action可以交给Spring管理,但Struts2的拦截器就拦截到不到请求了,望高手帮忙! 解决方案 我也遇到同样的问题 不整合的时候struts什么都能拦,整合后就拦不了了

struts2.0-Struts2拦截器Struts2拦截器Struts2拦截器Struts2拦截器

问题描述 Struts2拦截器Struts2拦截器Struts2拦截器Struts2拦截器 请问谁有Struts2拦截器学习的详细资料,请问谁有Struts2拦截器学习的详细资料,感谢哈 解决方案 ? Struts2拦截器 ? ? 一.什么是拦截器? 1.拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 在Webwork的中文文档的解释为--拦截器是动态

struts2自定义拦截器怎么进不去

问题描述 一个破拦截器搞了半天没发现哪里出问题了就是进不去自定义的拦截器里,下面贴代码:struts.xml<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dt

struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化

其实学习框架,就是为了可以很好的很快的完成我们的需求,而学习struts2只是为了替代之前用的servlet这一层,框架使开发更加简单,所以作为一个小菜鸟,特别感谢那些超级无敌变态开发的框架供我们使用,当然说那些使超级无敌变态并不是说他们很变态,是他们的思想太强大了. 言归正传,这次使用的拦截器是struts2框架的核心之处,希望学习struts2框架的小伙伴重视起来哦.一起共勉.  1:第一步依旧是导包哦,使用别人的框架,第一步,就记住导入自己使用的核心包即可. 2:配置web.xml过滤器,

Struts2 自定义拦截器栈后无法得到表单参数之解决办法

我自定义了一个拦截器,目的是在action执行之前像ValueStack中设置一些属性,代码是这样的: view plaincopy to clipboardprint? HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);        OgnlValueStack stack=(OgnlValueStack)request.getAt

关于struts2中拦截器(interceptor)的问题!!

问题描述 <!-- 系统级包 --><package name="systemPackage" extends="struts-default,json-default"abstract="true"><interceptors><interceptor name="status" class="com.util.statusInterceptor" />&l

Struts2的拦截器中属性页面获取问题,求解呀!

问题描述 首先表示感谢,我的问题是这样,客户端通过Jquery与后台Action进行交互,Action返回JSON数理由Jquery在前台页面外理,此时我想在Action中加入一个拦截器判断用户是否登录过,拦截器有一个字段标识用户是否登录,我需要在页面上显示,但是页面获取到的数据总为null,拦截器代码如下:public class GroupManagerInterceptor extends AbstractInterceptor {private static final long ser

java Struts2 在拦截器里的跳转问题_JSP编程

复制代码 代码如下: java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:405) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725) at org.apache.struts2.dispatcher.Dispatcher.servi