拦截器是动态拦截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>
转载于:https://blog.51cto.com/qmkkd/1840127