一、最简单的拦截器
1)自定义
拦截器类:
public class LoggerInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub System.out.println("记录日志............"); return invocation.invoke(); } }
2)配置:
<package name="User" namespace="/user" extends="struts-default"> <!-- 包要用的拦截器 --> <interceptors> <interceptor name="logger" class="com.meetcomet.LoggerInterceptor"/> <interceptor name="authority" class="com.meetcomet.AuthorityInterceptor"/> </interceptors> <action name="User*" class="com.meetcomet.action.UserAction" method="{1}" > <result name="success">/welcome.jsp</result> <interceptor-ref name="logger"/> </action> </package>
二、拦截器栈
1)拦截器类(同一)
2)配置
<package name="User" namespace="/user" extends="struts-default"> <!-- 包要用的拦截器 --> <interceptors> <interceptor name="logger" class="com.meetcomet.LoggerInterceptor"/> <interceptor name="authority" class="com.meetcomet.AuthorityInterceptor"/> <interceptor-stack name="mystack" > <interceptor-ref name="authority"/> <interceptor-ref name="logger"/> </interceptor-stack> </interceptors> <action name="User*" class="com.meetcomet.action.UserAction" method="{1}" > <result name="success">/welcome.jsp</result> <interceptor-ref name="mystack"/> </action> </package>
按栈顺次运行。
三、拦截器的例子
1)用接口方法实现(可用类可用接口)的时间类,(其实可以直接用timer拦截器,见后)
public class MyLoggingInterceptor implements Interceptor{ private static final long serialVersionUID = 1L; public String intercept(ActionInvocation invocation) throws Exception { String className = invocation.getAction().getClass().getName(); long startTime = System.currentTimeMillis(); System.out.println("Before calling action: " + className); String result = invocation.invoke(); long endTime = System.currentTimeMillis(); System.out.println("After calling action: " + className + " Time taken: " + (endTime - startTime) + " ms"); return result; } public void destroy() { System.out.println("Destroying MyLoggingInterceptor..."); } public void init() { System.out.println("Initializing MyLoggingInterceptor..."); } }
2)权限管理(用AbstractInterceptor实现)
public class AuthorityInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub ActionContext ctx = invocation.getInvocationContext(); Map mySession = ctx.getSession(); String role=(String)mySession.get("ROLE"); if (null!=role && role.equals("admin")) { System.out.println("调用授权........"); return invocation.invoke(); } ctx.put("tip", "你还没有登录"); return Action.LOGIN; } }
四、系统拦截器
系统提供了很多拦截器。比如 timer,会把action的运行时间打印在后台
<action name="User*" class="com.meetcomet.action.UserAction" method="{1}" >
<result name="success">/welcome.jsp</result>
<interceptor-ref name="mystack"/>
<interceptor-ref name="timer"/>
</action>
五、拦截方法
1)拦截类 继承MethodFilterInterceptor类
public class MethodInterceptor extends MethodFilterInterceptor { @Override protected String doIntercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub System.out.println("拦截方法 ------"); return invocation.invoke(); } }
2)配置:
add,del方法不用拦截。也可用includeMethod参数
<action name="User*" class="com.meetcomet.action.UserAction" method="{1}" >
<result name="success">/welcome.jsp</result>
<interceptor-ref name="mystack"/>
<interceptor-ref name="timer"/>
<interceptor-ref name="method">
<param name="excludeMethods">add,del</param>
</interceptor-ref>
</action>