拦截器的案例讲解

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

(1)拦截器在action对象创建之后,action里面的方法执行之前执行

(2)在struts2里面执行默认的拦截器,在action不需要调用拦截器的方法,使用配置方式执行--- aop思想

(3)执行很多的拦截器,比如有三个拦截器,首先执行拦截器1,做放行,执行拦截器2,之后放行,执行拦截器3,放行之后,之后action里面的方法

下面通过案例的形式来进行讲解:

<form action="${pageContext.request.contextPath }/user_login.action" method="post">
		用户名:<input name="username" type="text" >
		密码:<input name="password" type="password" >
		<br/>
		<input type="submit" value="登陆">
	</form>
登陆成功的页面loginSucess.jsp代码

<h1>恭喜您登陆成功!!</h1>
	<h3>用户名为:${sessionScope.username }</h3>
	<form action="${pageContext.request.contextPath }/user_look.action" method="post">
		<!-- 在此页面上点击“跳转”测试在没有登陆时是否可以执行look方法。 -->
		<input type="submit" value="跳转">
	</form>
action中的UserAction代码:

public class UserAction extends ActionSupport{
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	//默认执行的execute方法
	@Override
	public String execute() throws Exception {
		System.out.println("我爱你中国");
		return NONE;
	}
	//登陆方法
	public String login(){
		//这里就不调用数据库了,直接以此来代替查询数据库。
		if (username.equals("小明")) {
			//将用户名的信息存入到session中。
			ServletActionContext.getRequest().getSession().setAttribute("username", username);
			//返回到某个字符串,从而跳转到action对应的页面上。
			return "loginSucess";
		} else {
			return "login";
		}
		
	}
	//测试不登陆时,是否调用look方法。
	public String look(){
		System.out.println("您已登录!!");
		return NONE;
	}
}

拦截器UserInterceptor的代码:

/*
 *拦截器一般是通过继承AbstractInterceptor或者MethodFilterInterceptor
 *这两个类来实现的。
 */
public class LoginInterceptor extends MethodFilterInterceptor{
	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		//利用ServletActionContext的静态方法得到session对象
		HttpSession session = ServletActionContext.getRequest().getSession();
		//从session中获取到username的值。
		Object object = session.getAttribute("username");
		//判断获取到的username的值是否为空,这也是拦截器实现登陆拦截的逻辑。
		if (object!=null) {
			//执行action中的方法,类似于放行
			return invocation.invoke();
		} else {
			return "login";
		}
		
	}

}
我们创建完拦截器之后还要给拦截器进行配置,从而建立和action的联系,而这个关联实在struts.xml配置文件中实现的。

配置文件struts.xml文件的代码:

<span style="font-family:KaiTi_GB2312;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC  
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo4" extends="struts-default" namespace="/">
		<!-- 声明拦截器 -->
		<interceptors>
			<interceptor name="loginInterceptor" class="cn.itcast.interceptor.LoginInterceptor"></interceptor>
		</interceptors>
		
		<action name="user_*" class="cn.itcast.action.UserAction" method="{1}">
			<result name="login">/login.jsp</result>
			<result name="loginSucess">/loginSucess.jsp</result>
			<!-- 使用自定义拦截器 -->
			<interceptor-ref name="loginInterceptor">
				<!-- 配置让action中的哪个方法不进行拦截
					 param标签的name属性值固定:excludeMethods
					 在param标签里面,写上不被拦截的方法名 -->
				<param name="excludeMethods">login</param>
			</interceptor-ref>
			<!-- 执行默认拦截器
				使用自定义拦截器的特点:struts2里面的默认拦截器就不会再执行了,
				需要我们手动的使用一次。
			 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
		</action>
		
	</package>
	
</struts></span>

代码中都有注释,作为程序员我们对代码都有自己的理解,在这里我就不一一讲解了,当然也希望此篇博客对各位能有所帮助。



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值