您的位置:首页 > 编程语言 > Java开发

Struts2拦截器

2015-12-29 23:19 429 查看
简单了解拦截器

拦截器,在AOP中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。 拦截器链,也被称为拦截器栈。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

Struts 2已经提供丰富多样的,功能齐全的拦截器实现。具体可以到struts2-core-2.3.16.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

如果想要使用struts2自带拦截器,只需要在应用程序struts.xml文件中将package中继承其中的struts-default,然后在action配置中,使用“<interceptor-ref name="xx" />”引用拦截器或拦截器栈。

需要注意: 一旦package继承了struts-default,该package中所有的action都会调用拦截器栈 ——defaultStack。但是,如果在action配置中加入“<interceptor-ref name=”xx“ />”,默认的defaultStack拦截器栈将不起作用。

这里测试记录登录日志的拦截器(使用方法一)----自定义拦截器使用

自定义拦截器的三个方法:

方法一:实现Interceptor接口

方法二:继承AbstractInterceptor类

方法三:继承MethodFilterInterceptor类

LoginInterceptor.java


package com.cy.interceptor;

import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.cy.action.LoginAction;
import com.cy.entity.User;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**
* 登录日志拦截
* @author acer
*
*/
public class LoginInterceptor implements Interceptor {

private static final long serialVersionUID = 1L;

@Override
public void destroy() {
}

@Override
public void init() {
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {

//获取目标对象
LoginAction login=(LoginAction) invocation.getAction();
System.out.println("拦截前:"+ new Date().getTime());
String str= login.execute();//在该拦截器后没有其他拦截器的情况下调用
//        invocation.invoke();//在该拦截器后有其他拦截器的情况下调用
User user= (User) ServletActionContext.getRequest().getAttribute("user");
if(user!=null){
//记录登录日志
}
System.out.println("拦截后:"+ new Date().getTime());
return str;
}

}


在struts.xml里的设置

<!--定义拦截器 放在package里 并要求继承 struts-default -->
<interceptors>
<interceptor name="loginInterceptor" class="com.cy.interceptor.LoginInterceptor"></interceptor>
<!--  <interceptor name="exitInterceptor" class="com.cy.interceptor.ExitInterceptor"></interceptor> -->

<!-- 定义一个拦截器栈 -->
<interceptor-stack name="logStack">
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<!--  <interceptor-ref name="exitInterceptor"></interceptor-ref>  -->
</interceptor-stack>
</interceptors>


<action name="login" class="com.cy.action.LoginAction">
<!-- 显示配置引用Struts2默认的拦截器 defaultStack -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!--自定义拦截器  -->
<interceptor-ref name="loginInterceptor"></interceptor-ref>
</action>


LoginAction.java 部分代码;

public String execute(){
System.out.println("++"+user.getUserName());
System.out.println("=="+user.getPassword());

if(user.getUserName().equals("kitty")&&user.getPassword().equals("hello")){
ServletActionContext.getRequest().getSession().getAttribute("user");
return SUCCESS;
}
else {
return ERROR;
}

}


显示结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: