拦截器
拦截器分类:1) struts框架自带拦截器:
sturts-default.xml文件中里有多种拦截器如params.......等,
在struts.xml中只要包extends了struts-default,那么每个Action都拥有一些拦截器,拥有的这些叫默认拦截器栈defaultStack
2) 自定义拦截器(权限控制等)
如何自定义拦截器:
1)
com.opensymphony.xwork2.interceptor.Interceptor接口 ----------> (只有init,destroy,intercept方法)
要实现接口里的三个方法:
public void destroy(){}
public void init(){}
public String intercept(ActionInvocation invocation) throws Exception
{
String result = invocation.invoke();
}
2)
com.opensymphony.xwork2.interceptor.AbstractInterceptor 抽象类 ---------->(只有intercept方法)
public String intercept(ActionInvocation invocation)throws Exception
{
String result = invocation.invoke();
}
3)com.opensymphony.xwork2.interceptor.MethodFilterInterceptor抽象类 ----------> (这个拦截器可以指定要拦截或不拦截的方法列表)
protected String doIntercept(ActionInvocation arg0) throws Exception {
String result=arg0.invoke();
}
Struts.xml中配置:
<struts> <package name="hello1" extends="struts-default"> <interceptors> <interceptor name="interceptorDemo" class="interceptor.InterceptorDemo"> <param name="time">300</param> </interceptor> <interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor> <interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor> </interceptors> <action name="loginAction_*" class="action.LoginAction" method="{1}"> <result name="success">/index.jsp</result> <result name="final">/login.jsp</result> <interceptor-ref name="interceptorDemo"></interceptor-ref> <interceptor-ref name="abstractInterceptorDemo"></interceptor-ref> <interceptor-ref name="methodFilterInterceptorDemo"> <param name="includeMethods">login2</param> <!-- 对LoginAction中的execute方法进行拦截 --> <param name="excludeMethods">login1,login3</param> <!-- 对LoginAction中的MyExecute方法不进行拦截 --> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
注意:1)多个拦截器作用于一个Action,拦截器是有顺序的
2)设置拦截器或不拦截的方法时,如果有多个方法,那么以逗号(,)分隔,
如果一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当作要拦截的方法。
也就是说, includeMethods优先于execludeMethods。
拦截器栈:就是将一些拦截器组合起来进行统一管理
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="hello1" extends="struts-default"> <interceptors> <interceptor name="interceptorDemo" class="interceptor.InterceptorDemo"> <param name="time">300</param> </interceptor> <interceptor name="abstractInterceptorDemo" class="interceptor.AbstractInterceptorDemo"></interceptor> <interceptor name="methodFilterInterceptorDemo" class="interceptor.MethodFilterInterceptorDemo"></interceptor> <!-- 拦截器栈1 --> <interceptor-stack name="one"> <interceptor-ref name="interceptorDemo"></interceptor-ref> <interceptor-ref name="abstractInterceptorDemo"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> <!-- 拦截器栈2 --> <interceptor-stack name="two"> <interceptor-ref name="methodFilterInterceptorDemo"> <param name="includeMethods">login2</param> <param name="excludeMethods">login1,login3</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="loginAction_*" class="action.LoginAction" method="{1}"> <result name="success">/index.jsp</result> <result name="final">/login.jsp</result> <interceptor-ref name="one"></interceptor-ref> <interceptor-ref name="two"></interceptor-ref> </action> </package> </struts>
拦截器的应用
1.访问权限拦截器
1)JSP
2)Action:获取页面上的数据,验证成功后,把用户信息存入session中,然后跳转到另一个Action
3)对另一个Action进行拦截,从session中取值,判断用户是否登录,在进行跳转
4)为什么写二个Action,因为,第一个Action是为了往session中放值,如果是后拦截不起作用。所以得用第二个Action
5)struts.xml要对第二个Action配置上拦截器
6)访问权限为什么非写在拦截器里:为了重用(有可能其它Action也要用)
使用令牌token防止表单重复提交
1)index.jsp
<%@ taglib prefix="s" uri="/struts-tags"%> <body> <form action="login"> username: <input type="text" name="username" /> <br> password: <input type="password" name="password" /> <br> <s:token></s:token> <!-- GR8JKKSN5YMG1GY5VA35NOZ40HE4QA1A --> <input type="submit" value="提交"> </form> </body>
2)action
//action类是需要继承ActionSupport这个类的,不然struts识别不了 //在重复提交时,Token会产生一个重复的提交的信息,由ActionSupport得到信息后,在存入TokenAction这个类中 public class TokenAction extends ActionSupport { public String execute() throws Exception { return SUCCESS; } }
3)struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- i18n这个常量的值是什么,这个值是当前默认文件的相对路径,但是不带后缀 当无其它国际化配置文件时,使用默认配置文件 --> <constant name="struts.custom.i18n.resources" value="action.resourc"></constant> <package name="action" namespace="/" extends="struts-default"> <action name="tokenAction" class="action.TokenAction"> <result name="success" >/welcome.jsp</result> <!-- name="invalid.token" 表单重复提交就转到此页面,并提示用户已重复提交 --> <result name="invalid.token" >/error.jsp</result> <!-- 为action引入token拦截器 --> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>