Struts2 拦截器攻略
简介
Struts2 拦截器是一种非常重要的 Struts2 框架的组成部分,可以用来拦截请求并对请求进行处理,比如对请求的参数进行过滤和验证,或记录日志等。通过自定义拦截器,可以实现更加灵活和自定义的业务逻辑处理。
Struts2 拦截器的框架
Struts2 拦截器框架是由三个主要部分组成的:
- 拦截器接口(Interceptor Interface);
- 拦截器的配置参数(Interceptor Parameters);
- 拦截器栈(Interceptor Stack)。
拦截器接口
Interceptor 接口包含两个方法,分别是 init() 和 intercept(),其中 init() 方法用于进行拦截器的初始化操作,intercept() 方法用于对请求进行处理。
public interface Interceptor {
public void init();
public String intercept(ActionInvocation invocation) throws Exception;
}
拦截器配置参数
Struts2 允许在配置文件中,对每个拦截器进行配置参数的设置,这些配置参数可以通过 Interceptor 接口的 init() 方法在拦截器被调用之前进行初始化。
拦截器栈
Interceptor Stack 是所有拦截器的集合,可以使用一个栈的数据结构来表示。在 Struts2 中,拦截器栈由 Configuration 和 Interceptor 类型组成。配置文件中的每个
自定义 Struts2 拦截器
自定义 Struts2 拦截器,需要按照以下步骤进行:
- 实现 Interceptor 接口;
- 实现 init() 方法,进行拦截器的初始化;
- 实现 intercept() 方法,对请求进行处理;
- 在 struts.xml 中进行拦截器的配置。
示例一
假设我们需要实现一个拦截器,用于统计每个请求的执行时间,即计算用户提交请求到服务器最终响应所需的时间。我们可以基于 Struts2 拦截器框架,自定义一个 StopWatchInterceptor 统计器,并在 struts.xml 配置文件中,应用这个拦截器。
StopWatchInterceptor代码
StopWatchInterceptor.java
public class StopWatchInterceptor implements Interceptor {
@Override
public void destroy() {}
@Override
public void init() {}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取当前时间戳
long startTime = System.currentTimeMillis();
// 处理请求
String result = invocation.invoke();
// 计算请求处理时间
long endTime = System.currentTimeMillis();
long elapsed = endTime - startTime;
// 输出日志
System.out.println("Action [ " + invocation.getAction()
+ " ] execute time : " + elapsed + "ms");
return result;
}
}
struts.xml配置
在 struts.xml 配置文件中,添加如下内容:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="stopWatch" class="com.example.StopWatchInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="stopWatch"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="hello" class="com.example.HelloAction">
<result name="success">hello.jsp</result>
</action>
</package>
上面代码中:
- 在 <interceptors>
元素中,添加名称为 "stopWatch" 的自定义拦截器;
- 在 <interceptor-stack>
元素中,组合 stopWatch 拦截器和默认拦截器;
- 在 <default-interceptor-ref>
中指定要使用的拦截器栈;
- 在 <action>
元素中,增加了新拦截器。
示例二
假设我们需要实现一个拦截器,用于检查用户是否已经登录,如果没有登录,则跳转到登录页面。我们可以基于 Struts2 拦截器框架,自定义一个 LoginInterceptor,并应用到需要登录的页面上。
LoginInterceptor代码
LoginInterceptor.java
public class LoginInterceptor implements Interceptor {
@Override
public void destroy() {}
@Override
public void init() {}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 获取当前 SESSION 对象
Map<String, Object> session = invocation.getInvocationContext().getSession();
// 判断用户是否已经登录
if (session.get("user") == null) {
// 跳转到登录页面
return "login";
} else {
// 用户已经登录,继续处理请求
String result = invocation.invoke();
return result;
}
}
}
struts.xml配置
在 struts.xml 配置文件中,添加如下内容:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="login" class="com.example.LoginInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="login"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"/>
<action name="login" class="com.example.LoginAction">
<result name="success">index.jsp</result>
<result name="login">login.jsp</result>
</action>
<action name="list" class="com.example.ListAction">
<result name="success">list.jsp</result>
</action>
</package>
上面代码中:
- 在 <interceptors>
元素中,添加名称为 "login" 的自定义拦截器;
- 在 <interceptor-stack>
元素中,组合 login 拦截器和默认拦截器;
- 在 <default-interceptor-ref>
中指定要使用的拦截器栈;
- 在 <action>
元素中,增加了 login 拦截器和新的拦截器。
总结
- Struts2 拦截器是 Struts2 的重要组成部分,用于拦截请求并对请求进行处理。
- Struts2 拦截器框架分为拦截器接口、拦截器的配置参数和拦截器栈三个部分。
- 可以通过自定义拦截器来实现更加灵活和自定义的业务逻辑处理,自定义拦截器需要实现 Interceptor 接口。
- 在配置 struts.xml 文件时,可以使用自定义拦截器并对其进行配置,可以实现对请求进行处理的业务逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2拦截器_动力节点Java学院整理 - Python技术站