1. Struts2执行流程
2. 拦截器简介
2.1 什么事拦截器?
Struts大多数功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。
2.2 什么事拦截器栈?
从结构上看,拦截器栈相当于多个拦截器的组合。
从功能上看,拦截器栈也是拦截器。
2.3 拦截器工作原理
拦截器的执行过程是一个递归的过程
3. 自定义拦截器
3.1 方式一:实现Interceptor接口
- void init():初始化拦截器所需资源
- void destory():释放在init()中分配的资源
- String intercept(ActionInvocation ai) throws Exception
- 实现拦截器功能
- 利用ActionInvocation参数获取Action装态
- 返回result字符串作为逻辑视图
3.2 方式二:继承AbstractInterceptor类
- 提供了init()和destory()方法的空实现
- 只需实现intercept方法即可
4. 入门案例(计算Action的执行时间)
4.1 实现步骤
创建拦截器
在配置文件中定义拦截器并引用他
4.2 具体步骤
5. 内建拦截器
6. 用拦截器实现登录权限控制
login.jsp
<body>
<h2>登录界面</h2>
${ loginError }
<form action="login.action" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录" />
</form>
</body>
struts.xml
<struts>
<!-- 定义常量禁用动态函数调用和开启开发者模式 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
<constant name="struts.devMode" value="true"></constant>
<!-- 定义一个包,指定包名为default 命名空间设置为跟命名空间
继承自struts-default包
-->
<package name="default" namespace="/" extends="struts-default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor>
<!-- 自定义拦截器栈myStack,组合了defaultStack和auth -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 通过此Action访问后台管理页面,需要判断用户是否已登录
如果为未登录则跳转到登录页面(成功完成对auth这个action的拦截并且进行权限的校验)
-->
<action name="auth">
<result>/WEB-INF/page/manager.jsp</result>
<result name="login">/login.jsp</result>
<!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
<action name="login" class="com.imooc.action.LoginAction" method="login">
<result>/WEB-INF/page/manager.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>
LoginAction.java
public class LoginAction extends ActionSupport implements SessionAware{
private String username;
private String password;
private Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
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;
}
//处理登录请求
public String login() {
if ("admin".equals(username)&&"123".equals(password)) {
session.put("loginInfo", username);
return SUCCESS;
}else {
session.put("loginError", "用户名或密码不正确");
return ERROR;
}
}
AuthInterceptor
public class AuthInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = ActionContext.getContext();
Map<String, Object> session = context.getSession();
if (session.get("loginIndo")!=null) {
String result = invocation.invoke();
return result;
}else {
return "login";
}
}
}