拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

        在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

       

        拦截器栈(Interceptor Stack)类似于过滤器链。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器栈的拦截器就会按其之前定义的顺序被调用。


        我们可以自定义一个拦截器,拦截我们想要拦截的请求。这里我们让未登录的用户无法访问特定页面。话不多上代码。


一、页面:

    1、login.jsp

<body>
	<h2>user login</h2>
	
	<!-- el表达式 直接获取session中的值-->
	${loginError }
	<form action="login.action" method="post">
		Name:<input type="text" value="username"/><br>
		password:<input type="password" value="password" /><br>
		<input type="submit" value="login"/>
	</form>
</body>

    2、hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	hello!
</body>
</html>


二、Action:

    loginAction.java

public class LoginAction extends ActionSupport implements ModelDriven<User>{
	
	private User user= new User();
	private Map<String,Object> session;
	
	public String login(){
		if("admin".equals(user.getUsername())&&"123".equals(user.getPassword())){
			session.put("loginInfo", user.getUsername());
			return SUCCESS;
		}else{
			session.put("loginError", "username or password error");
			return ERROR;
		}
	}
	
	@Override
	public User getModel() {
		return user;
	}
	
}


三、拦截器

    AuthInterceptor.java

public class AuthInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invacation) throws Exception {
		ActionContext context=ActionContext.getContext();
		Map<String,Object> session=context.getSession();
		
		if(session.get("loginInfo")!=null){
			String result=invacation.invoke();
			return result;
		}else{
			return "login";
		}
		
	}

}

    

四、配置文件

    struts.xml

<?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>
	
	<constant name="struts.enable.DynamicMethodInvacation" value="false"></constant>
	<constant name="struts.devMode" value="true"></constant>
	
	<package name="default" namespace="/" extends="struts-default">
		
		<!-- 注册拦截器 -->
		<interceptors>
			<interceptor name="auth" class="com.ouc.interceptor.AuthInterceptor"></interceptor>
			<!-- 自定义拦截器栈 -->
			<interceptor-stack name="myStack">
			        <!--加入默认拦截器栈-->
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="auth"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		
		<action name="auth"> 
			<result>/WEB-INF/page/hello.jsp</result>
			<result name="login">/login.jsp</result>
			<!-- 引用自定义拦截器栈 -->
			<interceptor-ref name="myStack"></interceptor-ref>
		</action>
	
		<action name="login" class="com.ouc.action.LoginAction" method="login">
			<result>/WEB-INF/page/hello.jsp</result>
			<result name="error">/login.jsp</result>
		</action>
	</package>
	
</struts>