ACTION拦截器栈

       拦截是每个项目安全必有的一样东西,一般的过滤器无法拦截ACTION,在这里我们就要用到ACTION拦截器栈,ACTION拦截器栈并不难,一起来看。

推荐过滤器和拦截器栈一起使用效果非常好。

 

 首先第一步,先写一个继承AbstractInterceptor的JAVA类,获取登陆状态,判断其是否为空。

  1.  
  2. import org.apache.struts2.ServletActionContext;  
  3.  
  4. import com.opensymphony.xwork2.ActionContext;  
  5. import com.opensymphony.xwork2.ActionInvocation;  
  6. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  7.  
  8. public class LoginInterceptor extends AbstractInterceptor {  
  9.  
  10.     public String intercept(ActionInvocation invocation) throws Exception {  
  11.        String statte = (String) ServletActionContext.getRequest().getSession().getAttribute("login_state"); //获取登陆状态 
  12.        if (statte != null) {  //判断是否为空       
  13.      return invocation.invoke();  //如果为是,继续执行ACTION方法
  14.         } else {  
  15.             return "backerror";   //如果为否,弹出
  16.         }  
  17.     }  
  18. }  
  19.   

在这里  我判断是否为空   

不为空时 继续执行所请求的ACTION  

为空时  我则返回backerror 

下面请看我Struts.xml

  1. <interceptors> 
  2.            <interceptor name="authority" class="org.yzsoft.examdemo.action.LoginInterceptor"></interceptor> 
  3.         <!-- 拦截器栈 -->     
  4.            <interceptor-stack name="myDefault"> 
  5.                <interceptor-ref name="defaultStack"></interceptor-ref> 
  6.                <interceptor-ref name="authority"></interceptor-ref> 
  7.            </interceptor-stack> 
  8.           
  9.        </interceptors> 
  10.  
  11.        <global-results> 
  12.     <!-- 当返回error视图名时,转入/error.jsp页面 -->     
  13.            <result name="backerror">error.jsp</result> 
  14.            <result name="fronterror">login.jsp</result> 
  15.        </global-results> 

 如果ACTION返回的是backerror 跳转error.jsp  其实在这里可以直接跳回登陆页面 

   但是为了安全  还是要注销SESSION    不管有没有   

下面是我error.jsp代码

 

  1. <script type="text/javascript"> 
  2.     function load() {  
  3.         alert('请重新登录!');  
  4.         session.removeAttribute("examusers_name");   
  5.         session.removeAttribute("login_state");   
  6.         session.removeAttribute("adminusers_usersname");   
  7.         session.removeAttribute("adminusers_role"); 
  8.  parent.parent.location.href = "login.jsp";  
  9.     }  
  10. </script> 
  11. <body onload="load()"> 
  12. </body> 

   可以看到,我调用 load的方法 注销了登陆的时候激发的SESSION 

然后执行了跳转    而那个parent方法     由于用的是框架  一般的跳转只有right(内容)跳转 而left  (左边栏目)和 top(页头)  不执行跳转 在这里我们就要用到parent这个方法他可以让整个框架跳转,好了。现在来说ACTION调用拦截器栈。

  ACTION调用拦截器栈,很简单。一句话就OK了        注意:  需要上面的拦截器栈代码    myDefault 是调用拦截器栈代码的 myDefault

  1. <interceptor-ref name="myDefault" /> 
j

将这句话加在需要拦截的ACTION  格式如下:

  1. <action name="adminusers_*" class="adminusersaction" method="{1}"  > 
  2.         <result name="insert_false">back/users/users_insert.jsp</result> 
  3.         <result name="update_false">back/users/users_update.jsp</result> 
  4.         <result name="findall_true">back/users/users_list.jsp</result> 
  5.         <result name="findbyid_true">back/users/users_update.jsp</result> 
  6.         <result name="wrong">back/right.jsp</result> 
  7.         <result name="logout">backlogin.jsp</result> 
  8.         <interceptor-ref name="myDefault" /> 
  9.     </action>  

必须包含在ACTION里

在这里有个问题  就是登陆不进去。 为什么呢?

 因为你的登陆也被拦截了     拦截器栈所判断的是登陆成功所激活的值 

如果你的值一直为空  必然一直被拦截     那怎么解决呢。

只有将登陆的方法独立出去   独立一个新的且不包含拦截的ACTION     就OK了  试试吧。

--------------------------------------------------------------------------------------------

 谢谢观看  小弟新手 有什么不足 麻烦指出  在此谢谢了 

 

chenwei51制作   请尊重作者  转帖 需注明原地址