了解拦截器
Iterceptor,是struts2框架中一个非常重要的核心对象,可以动态增强Action
对象的功能
拦截器API
在struts2API中,存在一个名为com.opensymphony.xwork2.interceptor的包,该包中的对象是Struts2内置的一些拦截器对象,它们具有不同的功能。
Interceptor是struts2框架中定义的拦截器对象。它是一个接口,无论是struts2的内置拦截对象,还是自定义拦截器,都需要直接或间接实现此接口。
Interceptor的3个方法:
public interface interceptor extends Serializable{ void destory(); void init(); String interceptor(ActionInvocation invocation) throws Exception(); }
init()初始化方法
interceptor()拦截器主要方法,执行Action请求处理方法以及Action前后进行一些操作,动态增强Action功能
destory()销毁方法
只有调用了interceptor()参数invocation的invoke()方法才可以执行Action对象中的请求处理方法。
实现interceptor的实现接口AbstractInterceptor可以更简单的创建拦截器对象,不需要实现init()和destory()方法了,因为AbstractInterceptor类已经对interceptor中的init()和destory()进行了实现
使用拦截器的流程
浏览器--http请求-->FilterDispatcher---create-->ActoinProxy--调用-->Interceptor系列--前处理--execute()-->Action--result--后处理interceptor系列-->ActionProxy-->浏览器页面
使用拦截器:(package要继承struts-default才能使用Struts2里面的拦截器,默认拦截器配置是在struts-default里面的)
timer计时拦截器:
public class TestAction extends ActionSupport{ public String execute() throwa Exception{ Thread.sleep(1000); return SUCCESS; } } <struts> <constant name="struts.deMode" value="true"/> <constant name="struts.configuration.xml.reload" value="true"/> <package name="myPackage" extends ="struts-default"> <action name="testAction" class="com.action.TestAction"> <interceptor-ref name="timer"/> <result>success.jsp</result> </action> </package> </struts> timer是struts2的内置拦截器所以不需要创建直接配置就可以了 读取Action执行时间的拦截器
token防重复提交拦截器
public class TokenAction extends ActionSupport{ public static final List<String> NAMES=new ArrayList<String>(); private String name; public String execute(){ NAMES.add(name); return SUCCESS; } public void setName(String name){ this.name=name; } public static List<String> getNAMES(){ return NAMES; } } struts.xml <action name="token" class="com.action.Token"> <interceptor-ref name="token" /> <interceptor-ref name="basicStack" /> <result name="input ">/tokenInput.jsp</result> <result name="invalid.token">/tokenInvalid.jsp</result> <result>/success.jsp</result> </action> tokenInput.jsp <s:form action="token"> <s:token/> <!--token标记--> <s:label value="避免重复输入"/> <s:textfield name="name" labe="请输入命名" /> <s:submit name="提交" /> </s:form>
tokenInvalid.jsp
<body>
输入无效。<br/>
已输入的姓名:<s:property value="NAMES" /><br/>
<a href="tokenInput.action"><<重新输入</a>
</body>
使用token拦截器必须在<s:from>中插入<s:token>标记
basicStack拦截器是基础的多个拦截器集合,配置它struts2才会向action内自动赋值
execAndWait执行等待拦截器
public class WaitAction extends ActionSupport{ public String execute()throws Exception{ Thread.sleep(10000);//沉睡10秒,模拟大数据量处理 return SUCCESS; } } <action name="wait" class="com.action.WaitAction"> <interceptor-ref name="completeStack" /> <interceptor-ref name="execAndWait" /> <result>/WEB-INF/jsp/waitSuccess.jsp</result> <result name="wait">/WEB-INF/jsp/waiting.jsp</result> </action> <body> 页面提交(下载)中。。。请等待。。。 <script language="JavaScript"> setTimeout("location=location;",1000);//1s后刷新本页 </script> </body>
自定义权限验证拦截器
<interceptors> <interceptor name="authentication" class="com.interceptor.AuthenticationInterceptor"> </interceptor> </interceptors> <action name="authentication" class="com.action.AuthenticationAction"> <interceptor-ref name="authentication"></interceptor-ref> <result>/WEB-INF/jsp/authenticationSuccess.jsp</result> </action> public class AuthenticationInterceptor extends ActionSupport { public String intercept(ActionInvocation invocation)throws Exception{ Map<String,Object> sessionValues=invocation.getInvocationContext().getSession();//通过invocation获取上下文 String account=(String) sessionValues.get("account"); if(account==null){ return Action.LOGIN;//返回登陆页面 } return invocation.invoke();//正常执行,走向下一个拦截器或者Action } }