Struts2之拦截器
拦截器:在Action执行之前和之后进行一些额外的操作,相当于过滤器
拦截器的工作方式
1、拦截器
<interceptor name="privilege" class="com.test.interceptor.PrivilegeInterceptor"></interceptor>
name-拦截器名称
class-拦截器的实现类
2、拦截器栈
在实际开发中,需要在Action执行前执行多个拦截器,这时可以把多个拦截器组成一个拦截器栈,可以将栈内的多个拦截器当作一个整体来引用。
定义拦截器栈使用<interceptor-stack>
name-拦截器栈名
定义多个拦截器使用<interceptor-ref>
<interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="privilege"></interceptor-ref> </interceptor-stack>
在Action中声明拦截器使用<interceptor-ref>
<action name="book_*" class="com.test.Action.BookAction" method="{1}"> <result>/success2.jsp</result> <result name="login">/login.jsp</result> <interceptor-ref name="myStack"></interceptor-ref> </action>
3、默认拦截器
如果相对一个包(package)中的Action使用相同的拦截器,使用默认拦截器更方便些
<default-interceptor-ref>
<default-interceptor-ref name="defaultStack"></interceptor-ref>
默认拦截器在包内声明,若包内Action未显示的指定拦截器,则使用默认浏览器,若Action指定了拦截器,则覆盖掉默认拦截器。
一个包下只有一个默认拦截器,若想要多个默认拦截器,先将需要设置为默认的拦截器设置为拦截器栈,再使用default指定拦截器栈。
4、自定义拦截器
建立一个java类继承AbstractInterceptor重写
public String intercept(ActionInvocation invocation) throws Exception{return null;}
public class PrivilegeInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception{ ActionContext ac=invocation.getInvocationContext(); Object user = ac.getSession().get("user"); if (user!=null){ return invocation.invoke(); }else { ac.put("msg","未登录,请先登录"); return Action.LOGIN; } } }
<interceptor name="privilege" class="com.test.interceptor.PrivilegeInterceptor"></interceptor>
在<interceptor>的class元素中选择实现的拦截器类,就可以使用自定义拦截器了。