标签:proxy 定义 mod logs success 异常 method 浏览器 com
1. 拦截器是struts2的核心。Struts2的所有功能都是由拦截器来实现,在struts2中所有功能都是可以自由装配,可插拔实现的。2. 拦截器有点类似于过滤器,只不过拦截器只拦截action。
3. 在struts2提供了很多拦截器,分别来实现常见的一些功能。
4.在struts2中可以自定义拦截器来实现某些功能。自定义拦截器有两种实现方式,一种是实现Interceptor接口,一种是继承AbstractInterceptor类。
(a)编写一个类,该类实现Interceptor接口:
/** * 自定义拦截器 可以实现Interceptor接口也可以继承AbstractInterceptor类 * */ public class MyInterceptor implements Interceptor{ public void destroy() { } public void init() { } /** * 返回值为结果名称 :和result的名称匹配 */ public String intercept(ActionInvocation invocation) throws Exception { //invoke调用下一个拦截器执行,如果没有拦截器则执行action。如果被拦截,那么直接在该方法中返回运行结果 System.out.println("执行自定义的拦截器"); return invocation.invoke(); } }
(b)在struts.xml中配置拦截器,拦截器需要配置到package下。
<package name="default" namespace="/" extends="struts-default"> <!-- 配置拦截器 --> <interceptors> <!-- 配置自定义拦截器 拦截器的名称要唯一 --> <interceptor name="myInterceptor" class="cn.sxt.interceptor.MyInterceptor"></interceptor> </interceptors> <action name="hello" class="cn.sxt.action.HelloAction" method="hello"> <result>/success.jsp</result> <!-- 引用拦截器 --> <interceptor-ref name="myInterceptor"></interceptor-ref> </action> </package>
(c)在指定action中引用拦截器:
<action name="hello" class="cn.sxt.action.HelloAction" method="hello">
<result>/success.jsp</result>
<!-- 引用拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
</action>
5.拦截器在第一次执行时被创建,以后执行直接用即可。也就是拦截器是singleton。如果使用了自定义的拦截器,那么struts2默认的拦截器将不起作用。需要重新引用。
<action name="hello" class="cn.sxt.action.HelloAction" method="hello">
<result>/success.jsp</result>
<!-- 引用拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="myTimer"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
6.拦截器栈是拦截器的容器。在一个拦截器栈中可以引用多个拦截器,这样在使用时只需要引用拦截器栈即可,简化了拦截器的引用配置。引用拦截器栈和引用拦截器的方法时一致的。并且一个拦截器可以被多个拦截器栈引用。
<interceptors> <!-- 配置自定义拦截器 拦截器的名称要唯一 --> <interceptor name="myInterceptor" class="cn.sxt.interceptor.MyInterceptor"></interceptor> <interceptor name="myTimer" class="cn.sxt.interceptor.TimerInterceptor"></interceptor> <!-- 拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="myInterceptor"></interceptor-ref> <interceptor-ref name="myTimer"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <action name="hello" class="cn.sxt.action.HelloAction" method="hello"> <result>/success.jsp</result> <!-- 引用拦截器 --> <interceptor-ref name="myStack"></interceptor-ref> </action>
7.在之前的action中,并没有引用拦截器,原因时struts2中设置了默认的拦截器。在实际开发中,可以自定义默认拦截器:
<!-- 配置默认拦截器 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <action name="hello" class="cn.sxt.action.HelloAction" method="hello"> <result>/success.jsp</result> </action>
8.在应用开发中,有时候可能因为浏览器原因或者是计算机本身的原因导致一组数据多次提交的问题。也是表单重复提交;表单重复提交有两种解决办法,一种是通过js来实现。另一种是结合后台来实现。struts2提供了token拦截器就可以防止表单提交。token拦截器的实现步骤:
(a)在action配置中引用token拦截器:
<action name="add" class="cn.sxt.action.UserAction" method="add"> <result>/success.jsp</result> <result name="invalid.token">/invalid.jsp</result> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
(b)配置invalid.token这个结果应该跳转的页面:
<action name="add" class="cn.sxt.action.UserAction" method="add"> <result>/success.jsp</result> <result name="invalid.token">/invalid.jsp</result> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
(c)在表单中引用<s:token> 标签:
<form action="add.action" method="post"> <s:token></s:token> name:<input type="text" name="name"/><br> age:<input type="text" name="age"/><br> <input type="submit" value="submit"/> </form>
9. 通过拦截器来实现登陆拦截:
/** * 登录拦截器 * 实现 访问资源判断用户是否登录 如果用户登录则继续访问 ,如果用户没有登录则跳转到登录页面 * @author Administrator * */ public class LoginInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { //获取请求名称 String actionName = invocation.getProxy().getActionName(); //如果是登录 则继续执行 if(actionName.equals("login")){ return invocation.invoke(); } //如果session存在 则继续执行 Map<String,Object> session = invocation.getInvocationContext().getSession(); if(session.get("currentUser")!=null){ return invocation.invoke(); } //跳转到登录页面 return Action.LOGIN; } }
10. Action 级别的拦截器会拦截所有action.是一种粗粒度的拦截器。在有的应用中,拦截器可能只拦截部分方法,这种时候应用实现方法拦截器。
public class MethodInterceptor extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation invocation) throws Exception { System.out.println("方法拦截器被执行"); return invocation.invoke(); } }
配置:
<interceptor-ref name="methodInterceptor"> <!-- 配置别拦截的方法 也可以配置不被拦截的方法 --> <param name="includeMethods">add,hello</param> </interceptor-ref>
标签:proxy 定义 mod logs success 异常 method 浏览器 com
原文地址:http://www.cnblogs.com/forever2h/p/6728662.html