Struts2拦截器
Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。
拦截器工作原理
拦截器的执行过程是一个递归的过程
自定义拦截器
自定义拦截器主要有两种方式:
- 实现Interceptor接口
- 继承抽象拦截器类AbstractInterceptor
实现Interceptor接口
Interceptor接口中定义了三个方法
- init(): 在拦截器执行之前调用init()方法,主要用于初始化系统资源
- destroy(): 在拦截器实例被销毁之前,系统将会调用该方法来释放和拦截器相关的资源
- intercept(): 拦截器的核心方法
AbstractInterceptor
步骤:
- 创建一个继承自AbstractInterceptor的类
- 实现intercept方法
- 在struts.xml中配置
下面已一个例子来说明,该例子,是计算调用Action所话费的时间
如下,一个<a>标签,来调用对相应的action。
<a href="timer">访问Action并计算执行Action花费的时间</a>
创建一个拦截TimerInterceptor
package com.imooc.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/*
* 计算执行Action话费的时间
*/
public class TimerInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//执行Action之前
long start = System.currentTimeMillis();
//执行下一个拦截器,如果是最后一个拦截器,则执行目标Action
String result = invocation.invoke();
//执行Action之后
long end = System.currentTimeMillis();
System.out.println("执行Action花费时间:"+(end-start)+"ms");
return result;
}
}
在struts.xml中配置:
<struts>
<package name="default" namespace="/" extends="struts-default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="mytimer" class="com.imooc.interceptor.TimerInterceptor"></interceptor>
</interceptors>
<action name="timer" class="com.imooc.action.TimerAction">
<result>/success.jsp</result>
<!-- 引用拦截器 -->
<interceptor-ref name="mytimer"></interceptor-ref>
</action>
</package>
</struts>
Struts2内置拦截器
<action name="timer" class="com.imooc.action.TimerAction">
<result>/success.jsp</result>
<!-- 引入默认的拦截器栈-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用拦截器 -->
<interceptor-ref name="mytimer"></interceptor-ref>
</action>
- params拦截器 - 负责将请求参数设置为Action属性
- staticParams拦截器 - 将配置文件中action元素的子元素param参数设置为Action属性
- servletConfig拦截器 - 将源于Servlet API的各种对象注入到Action,必须实现对应接口
- fileUpload拦截器 - 对文件上传提供支持,将文件和元数据设置为对应的Action属性
- exception拦截器 - 捕获异常,并且将异常映射到用户自定义的错误页面
- validation拦截器 - 调用验证框架进行数据验证
例子
开发权限验证拦截器
主要功能是已登录用户可以访问管理页面,未登录用户则不能访问管理页面。
登录页面login.jsp
<h2>用户登录</h2>
<!-- 错误提示 -->
${loginError}
<form action="login.action" method="post">
用户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
创建LoginAction,使用session保存用户名
package com.imooc.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware {
private String username;
private String password;
private Map<String, Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
//处理登录请求
public String login()
{
if ("admin".equals(username) && "123".equals(password)) {
session.put("loginInfo", username);
return SUCCESS;
}else{
session.put("loginError", "用户名或密码不正确");
return ERROR;
}
}
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;
}
}
创建权限拦截器AuthInterceptor
package com.imooc.interceptor;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
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("loginInfo") != null) {
String result = invocation.invoke();
return result;
}else{
return "login";
}
}
}
在struts.xml中配置信息如下:
<struts>
<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访问后台管理页面,需要判断用户是否已登录
如果未登录,则返回登录视图 -->
<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>
SessionAwared的用法,参考:
本文介绍了Struts2中拦截器的工作原理及自定义方法,包括实现Interceptor接口和继承AbstractInterceptor类的方式。并通过实例展示了如何创建自定义拦截器来计算Action执行时间,以及开发权限验证拦截器。

998

被折叠的 条评论
为什么被折叠?



