1.拦截器工作流程
2.系统预定义拦截器
拦截器 | 名字 | 说明 |
Scoped Model Driven | scoped-model-driven | 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。 |
Parameters Interceptor | params | 将请求中的参数设置到Action中去。 |
Prepare Interceptor | prepare | 如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。 |
Scope Interceptor | scope | 将Action状态存入session和application的简单方法。 |
Servlet Config Interceptor | servletConfig | 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。 |
Static Parameters Interceptor | staticParams | 从struts.xml文件中将中的中的内容设置到对应的Action中。 |
Roles Interceptor | roles | 确定用户是否具有JAAS指定的Role,否则不予执行。 |
Timer Interceptor | timer | 输出Action执行的时间 |
Token Interceptor | token | 通过Token来避免双击 |
Token Session Interceptor | tokenSession | 和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中 |
Validation Interceptor | validation | 使用action-validation.xml文件中定义的内容校验提交的数据。 |
Workflow Interceptor | workflow | 调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面 |
Parameter Filter Interceptor | N/A | 从参数列表中删除不必要的参数 |
Profiling Interceptor | profiling | 通过参数激活profile |
拦截器 | 名字 | 说明 |
Scoped Model Driven | scoped-model-driven | 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。 |
Parameters Interceptor | params | 将请求中的参数设置到Action中去。 |
Prepare Interceptor | prepare | 如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。 |
Scope Interceptor | scope | 将Action状态存入session和application的简单方法。 |
Servlet Config Interceptor | servletConfig | 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。 |
Static Parameters Interceptor | staticParams | 从struts.xml文件中将中的中的内容设置到对应的Action中。 |
Roles Interceptor | roles | 确定用户是否具有JAAS指定的Role,否则不予执行。 |
Timer Interceptor | timer | 输出Action执行的时间 |
Token Interceptor | token | 通过Token来避免双击 |
Token Session Interceptor | tokenSession | 和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中 |
Validation Interceptor | validation | 使用action-validation.xml文件中定义的内容校验提交的数据。 |
Workflow Interceptor | workflow | 调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面 |
Parameter Filter Interceptor | N/A | 从参数列表中删除不必要的参数 |
Profiling Interceptor | profiling | 通过参数激活profile |
3.struts.xml里继承的struts-default.xml
拦截器和拦截器栈
<interceptor name="noop" class="org.apache.struts2.interceptor.NoOpInterceptor" />
<interceptor-stack name="emptyStack">
<interceptor-ref name="noop"/>
</interceptor-stack>
排除拦截的方法
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref>
默认的拦截器栈
<default-interceptor-ref name="defaultStack"/>
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
4.自定义拦截器
(1)登录拦截器
public class LoginInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation inv) throws Exception {
Object login = ActionContext.getContext().getSession().get("login");
String result = "";
if (login!=null) {
result = inv.invoke();
}else{
result = "login";
}
return result;
}
}
(2)配置struts.xml
<interceptors>
<interceptor name="login" class="net.study.interceptor.LoginInterceptor"
</interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="logger"></interceptor-ref>
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<global-results>
<result name="login">/login.jsp</result>
</global-results>
(3)测试login
@Actions({
@Action(value="/login",results={
@Result(name="success",location="/hello.jsp"),
},interceptorRefs={
@InterceptorRef("defaultStack")
}
)
})
public String login() throws Exception
{
if("zhangsan".equals(username)&& "123".equals(passwd)){
ActionContext.getContext().getSession().put("login", "OK");
}
else{
return "login";
}
return "success";
}
(4)login.jsp页面
<body>
<form action="../hello/login" method="post">
yonghuming: <input type="text" name="username">
mima: <input type="password" name="passwd">
<input type="submit" value="tijiao">
</form>
</body>
5.方法拦截器
(1)创建方法拦截器
public class MyMethodInterception extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
System.out.println("拦截" + arg0.getProxy().getMethod());
return arg0.invoke();
}
}
(2)配置struts.xml
<interceptors>
<interceptor name="login" class="net.study.interceptor.LoginInterceptor"></interceptor>
<interceptor name="myMethod" class="net.study.interceptor.MyMethodInterception">
</interceptor>
<interceptor-stack name="mystack">
<interceptor-ref name="logger"></interceptor-ref>
<!-- <interceptor-ref name="login"></interceptor-ref> -->
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="myMethod">
<!-- 排除方法 -->
<param name="excludeMethods">login</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<global-results>
<result name="login">/login.jsp</result>
</global-results>