拦截器
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里面配置找name为defaultStack的
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>