struts2之拦截器

(一)拦截器与过滤器

  1、过滤器,是在Java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符
拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
   2、拦截器与过滤器的区别 :
1、拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
6、执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。
一个Filter 可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。
  3、创建一个Filter 只需两个步骤:
(1)创建Filter 处理类:
(2)在web.xml 文件中配置Filter 。
创建Filter 必须实现javax.servlet.Filter接口,在该接口中定义了三个方法。
• void init(FilterConfig config): 用于完成Filter 的初始化。
• void destroy(): 用于Filter 销毁前,完成某些资源的回收。
• void doFilter(ServletRequest request,ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。 
4、过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>该元素位于filter-mapping中。

(二)拦截器相关设置:
  1、在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,
如下(这里我是引用了struts2自带checkbox拦截器):
<interceptor-ref  name="checkbox">
     <param  name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-refname="defaultStack"/>(必须加,否则出错)
  2、每一个拦截器都可以配置参数,有两种方式配置参数:
一是针对每一个拦截器定义参数:
<interceptor-ref  name="validation">
      <param  name="excludeMethods">myValidationExcudeMethod</param>
</interceptor-ref>
<interceptor-ref  name="workflow">
      <param  name="excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
二是针对一个拦截器堆栈统一定义所有的参数
<interceptor-ref  name="defaultStack">
      <param  name="validation.excludeMethods">myValidationExcludeMethod</param>
      <param  name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
3、每一个拦截器都有两个默认的参数:
excludeMethods - 过滤掉不使用拦截器的方法和
includeMethods – 使用拦截器的方法。

4、拦截器执行的顺序按照定义的顺序执行
5、如何访问HttpServletRequest,HttpServletResponse或者HttpSession有两种方法可以达到效果:
一、使用ActionContext:Map attibutes= ActionContext.getContext().getSession();
二、实现相应的接口:
HttpSession      ——>       SessionAware
HttpServletRequest         ——>   ServletRequestAware
HttpServletResponse    ——>ServletResponseAware

(三)自定义拦截器实例

Struts2自定义拦截器实例—只允许从登录页面进入系统
【1】struts.xml:
<!-- 定义一个拦截器-->
<interceptors>
     <interceptor  name="authority" class="org.interceptot.LoginInterceptor">
     </interceptor>
<!-- 拦截器栈-->
     <interceptor-stack  name="mydefault">
         <interceptor-ref  name="defaultStack"/>
         <interceptor-ref  name="authority"/>
     </interceptor-stack>
</interceptors>
<!-- 定义全局Result-->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面-->
     <result  name="login">/login.jsp</result>
</global-results>
<action  name="show" class="org.action.showAction">
     <result  name="success">/main.jsp</result>
     <!-- 使用此拦截器-->
     <interceptor-ref  name="mydefault"/>
</action>
<!--验证登录用户信息-->
<action  name="login" class="org.action.loginAction" method="execute">
     <result  name="error">/login.jsp</result>
     <result  name="input">/login.jsp</result>
</action>
【2】自定义拦截器org.interceptot.LoginInterceptor:
package org.interceptot;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  public class LoginInterceptorextends AbstractInterceptor {
            @Override
            public Stringintercept(ActionInvocation invocation) throws Exception {
            // 取得请求相关的ActionContext实例
                  ActionContext ctx =invocation.getInvocationContext();
                  Map session = ctx.getSession();
                  String user = (String)session.get("username");
            // 如果没有登陆,即用户名不存在,都返回重新登陆
                 System.out.println("user:"+user);
                  if (user != null) {
                       System.out.println("test");
                       return invocation.invoke();
                  }
                  System.out.println("你还没有登录");
                  ctx.put("tip", "你还没有登录");
                  return Action.LOGIN; //返回一个叫login的result结果
            }
    }
【3】进入主页面的Action:org.action.showAction
package org.action;
import com.opensymphony.xwork2.ActionSupport;
public class showActionextends ActionSupport {
         public String execute() {
             return "success";
         }
}
【4】LoginAction:
private boolean isInvalid(String value) {
       return (value == null || value.length()== 0);
}
if (isInvalid(user.getUsername()))
       return INPUT;
if (isInvalid(user.getPassword()))
       return INPUT;
//登录成功将User放入session中
HttpServletRequest request = ServletActionContext.getRequest();
Map map=ActionContext.getContext().getSession();
map.put("username", user.getUsername());
【5】如果我们通过show.action访问main.jsp那么就会被自定义拦截器拦住,拦截器检查session中
是否有值,有证明用户已经登录,没有则为没有登录,那么就会被跳转到登陆页面。


(四)拦截器原理:

     1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
     2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

 


(五)拦截器实现流程:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位远方的诗人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值