总结如何编写一个全局拦截登录信息的拦截器:
Demo中包括2个xml.一个struts.xml.一个user.xml;
在struts.xml中使用include标签引入user.xml;(便于模块化开发)
在struts.xml中创建package:
<package name="mydefault" namespace="/" extends="stack-default">
<interceptors> //配置我们自己的拦截器栈
<interceptor name="myinter" class="自定义拦截器的全类名"></interceptor>
<interceptor-stack name=”mystack”>
<interceptor-ref name=”myinter”></..>
<interceptor-red name=”defaultStack”> </..> //包裹入默认拦截栈
</interceptor-stack..>
<default-interceptor-ref name=”mystack”></default-interceptor-ref>
</interceptors>
</package>
在我们写的user.xml中只要package继承自mydefault即可;对于不需要过滤的比如登录action,
我们可以这样:
<action name=”load” class=”...” method=”load”>
<interceotor-ref name=”mystack”>
<param name=”myinter.excludeMethods”>load</param>//尖括号里写的是不需拦截的方法,与action标签中的method对应
</...>
</..>
-----------------创建一个自定义的拦截器类------
首先继承自MethodFilterInterceptor,重写doIntecept()方法,把我们要
过滤的信息方法写在其中:比如Demo中拦截用户直接通过url访问action的方法:
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
User u = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
if (u == null) {
return "login"; //起到了拦截的效果,拦截进入指定页面
}
return invocation.invoke();//放行进入下一个拦截器,如果有的话
} //如果没有下一个拦截器则允许访问action
其中值得注意的是拦截器3放行后没有其他拦截器,执行action,返回result后,加载并解析jsp,不过这个时候JSP仍然是没有显示在用户端的,等到解析完回到拦截器3,再回到2最后回到拦截器1,最后完成页面跳转。过程中:多个拦截器之间的数据通过ActionInvocation进行共享,假设一路放行,最后返回的String字符串是最后一个拦截器return的字符串也就决定了跳转到那个result结果集去。