| 
 
| 首先编写一个类,继承abstractinterceptor类或者实现interceptor接口,然后重写intercept方法; 
 public class CheckLoginInterceptor extends AbstractInterceptor {
 
 public String intercept(ActionInvocation invocation) throws Exception {
 //1.获取HttpSession
 HttpSession session = ServletActionContext.getRequest().getSession();
 //2.获取session域中的登录标记
 Object obj = session.getAttribute(“user”);
 //3.判断是否有登录标记
 if(obj == null){
 //用户没有登录
 return “input”;
 }
 //4.用户登录了,放行
 String rtValue = invocation.invoke();
 return rtValue;
 }
 
 }
 
 以上是一个检查登录的拦截器,
 
 制作拦截器完成之后就是在struts.xml中配置拦截器了,声明自定义拦截器的方法为
 
 <interceptors>声明拦截器
 <interceptor name=”checkLoginInterceptor” class=”com.itheima.web.interceptor.CheckLoginInterceptor” />
 </interceptors>
 
 使用时在action中如下配置
 
 <interceptor-ref name=”checkLoginInterceptor”></interceptor-ref>
 
 但是在这样配置后在struts2中默认的拦截器栈就不会再工作了。
 
 为了改善配置我们可以把我们自定义的拦截器和默认的拦截器放在一起
 
 <interceptors>
 <interceptor name=”checkLoginInterceptor” class=”com.itheima.web.interceptor.CheckLoginInterceptor” />
 定义一个拦截器栈,把我们自定义的拦截器和默认的拦截器栈放到一起.
 <interceptor-stack name=”myDefaultStack”>
 <interceptor-ref name=”defaultStack”></interceptor-ref>
 <interceptor-ref name=”checkLoginInterceptor”></interceptor-ref>
 </interceptor-stack>
 </interceptors>
 
 然后把这个myDefaultStack覆盖原来的默认拦击诶器栈,让我们的这个成为默认的覆盖了struts-default.xml中定义的默认拦截器栈。由myDefaultStack把defaultStack给替换了
 <default-interceptor-ref name=”myDefaultStack”></default-interceptor-ref>
 
 由于我们配置的拦截器是全局的,连登录都会拦截,所以我们要重新写拦截器,在AbstractInterceptor的子类中,还有一个抽象类MethodFilterInterceptor,它里面提供了两个属性。
 excludeMethods:哪些方法不需要拦截
 includeMethods:哪些方法需要拦截
 
 所以这次在写拦截器时就不继承AbstractInterceptor了而是继承MethodFilterInterceptor然后实现doIntercept这个方法。
 
 public class CheckLoginInterceptor1 extends MethodFilterInterceptor {
 
 public String doIntercept(ActionInvocation invocation) throws Exception {
 //1.获取HttpSession
 HttpSession session = ServletActionContext.getRequest().getSession();
 //2.获取session域中的登录标记
 Object obj = session.getAttribute(“user”);
 //3.判断是否有登录标记
 if(obj == null){
 //用户没有登录
 return “input”;
 }
 //4.用户登录了,放行
 String rtValue = invocation.invoke();
 return rtValue;
 }
 
 }
 
 拦截器写完之后就是配置了,由于是全局的所以在不需要验证的action中要去给它声明不需要验证,
 
 <action name=”login” class=”com.itheima.web.action.Demo2Action” method=”login”>
 <interceptor-ref name=”myDefaultStack”>
 <!– 在引用自定义拦截器栈的时候,给指定的拦截器注入参数。方式就是:拦截器名称.属性名称 –>
 <param name=”checkLoginInterceptor1.excludeMethods”>login</param>
 
 <!– 其中checkLoginInterceptor1是我们自己定义的拦截器,excludeMethods是methodfilterinterceptor中的两个方法之一,是来声明哪个方法不需要拦截的。 excludeMethods:哪些方法不需要拦截
 includeMethods:哪些方法需要拦截            –>
 </interceptor-ref>
 <result type=”redirectAction”>showMain</result>
 </action>
 | 
 |