Struts2 拦截器、防止重复提交

拦截器

struts2是基于拦截器运行的,defaultStack会拦截所有的action

 

public class CheckLogin implements Interceptor {                    实现接口Interceptor

public void destroy() {                                   Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

         }

         public void init() {                                           Init方法在拦截器类被创建之后,在对Action拦截之前调用,

         }

         public String intercept(ActionInvocation ai) throws Exception {                        Intercept是拦截器的主要拦截方法

                   System.out.println("我是一个拦截器");

                   Action action=(Action)ai.getAction();               //获取当前拦截的action

                   System.out.println("当前拦截的action"+action.getClass().getName());

                   Map session=ai.getInvocationContext().getSession();            //获取当前的session

                  

                   if(action instanceof Loginaction){                      是否包含这个action

                            ai.invoke();                                                      是,执行后面代码

                   }else{

Object accName=session.get("accName");             session里面获取名字

                   if(accName==null){                                                          空值

                            return "login";                                                        返回登录

                   }else{

                            ai.invoke();       //如果可以获取到session继续执行后面的代码

                   }}

                   Return   null;

         }

}

 

拦截器的地址struts2-core-2.2.1.jar包里面的struts-default.xml里面配置找namedefaultStack

struts.xml文件

<package name="default" namespace="/" extends="struts-default">继承了拦截器

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

|<!-- 配至拦截器 -->

|                 <interceptors>

|                

|                          <!-- 引入自定义的拦截器 -->

|                          <interceptor name="cLogin" class="com.hou.util.CheckLogin"></interceptor>           

|                         

|                          <!-- 把自定义的拦截器定义到堆栈 -->o

|                          <interceptor-stack name="checkLogin">

|                                   <interceptor-ref name="cLogin"></interceptor-ref>                        自己定义的拦截器

|                                   <interceptor-ref name="defaultStack"></interceptor-ref>             包里面的18个拦截器

|                          </interceptor-stack>

|                 </interceptors>

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

                   <!-- 把自己的拦截去设置成默认的 -->

                    <default-interceptor-ref name="checkLogin"/>

                    

                    <!-- 全局返回 ,返回结果action里面找不到的,在这里找-->

<global-results>

<result name="login">/error.jsp</result>

                    </global-results>

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

                    员工action

        <action name="emp" class="com.hou.action.Empaction">

                 <result>/emp/empList.jsp</result>

                 <result name="edit">/emp/editEmp.jsp</result>

        </action>       

防止重复提交

第一步:在表单中加入<s:token />

<s:form action="" method="post“>

  <s:textfield name="name"/><s:token/><s:submit/>                 提交的时候,变成隐藏域,提交的vlaue值是一个长串数字,value值不一致,返回"invalid.token"

 </s:form>

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

部门action     

<action name="dept" class="com.hou.action.Deptaction">

                  

                            <!-- deptAction里面引进19个拦截器 -->

                            <interceptor-ref name="token">                                                   引入struts-default.xml里面的token拦截器

                                     <param name="includeMethods">saveOrUpdate</param>          includeMethods使用拦截器的方法         excludeMethods - 过滤掉不使用拦截器的方法

                            </interceptor-ref>

                            <interceptor-ref name="checkLogin"/>                                       引入自己的拦截器

                           

                 <result>/dept/deptList.jsp</result> 

                 <result name="edit">/dept/editDept.jsp</result>

                

                 <!-- type="redirectAction"的执行结果可以访问Action里面的方法,不写type可以访问链接 -->

                 <result name="invalid.token" type="redirectAction">dept!deptList</result>

        </action>

配置加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛             登录action

<action name="login_*" class="com.hou.action.Loginaction" method="{1}">

                       <result>/index.jsp</result> 

                       <result name="input">/Login.jsp</result>

             </action>

    </package>


转载于:https://my.oschina.net/u/2353689/blog/476090

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值