- Struts2的拦截器机制
Struts2采用拦截器机制来对用户发出的请求进行拦截、处理和响应。拦截器是一组批处理过程,你可以在任何一个拦截器中编写你自己的代码,来处理对应的请求。例如,对于用户登录请求,可以通过拦截器机制进行身份验证。
- 实现对action请求对象的拦截操作
通过写一个继承自Interceptor
抽象类的拦截器,并实现intercept
方法,来实现对action请求对象的拦截操作。
以下是实现拦截器的步骤:
- 创建一个类并继承
Interceptor
抽象类。 - 实现
intercept
方法。在该方法中,可以获取当前的ActionContext
上下文,然后从中获取请求对象和响应对象,并对其进行相应的操作。 - 在
struts.xml
配置文件中,配置拦截器及其拦截范围。
下面是一个示例,在Struts2中,实现对请求中的参数进行身份验证:
public class AuthenticationInterceptor implements Interceptor {
public void destroy() {}
public void init() {}
public String intercept(ActionInvocation invocation) throws Exception {
Map<String, Object> session = invocation.getInvocationContext().getSession();
User user = (User) session.get("user");
if (user == null) {
return "login";
} else {
ActionProxy proxy = invocation.getProxy();
String method = proxy.getMethod();
Object action = invocation.getAction();
String[] parameterNames = ((HandlerMethodAction) action).getParameters(); //获取请求参数
/*对请求中的参数进行验证*/
if (parameterNames != null && parameterNames.length > 0) {
for (String paramName : parameterNames) {
String paramValue = invocation.getInvocationContext().getParameters().get(paramName)[0];
if (!StringUtils.isNumeric(paramValue)) {
return "error"; // 非法参数
}
}
}
return invocation.invoke();
}
}
}
在struts.xml
配置文件中,配置拦截器及其拦截范围:
<interceptors>
<interceptor name="authentication"
class="com.example.AuthenticationInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="authentication"/>
<interceptor-ref name="params"/> // 需要先执行params拦截器,才能获取到请求参数
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<action name="foo" class="com.example.FooAction">
<interceptor-ref name="defaultStack"/>
<result name="success">/result.jsp</result>
</action>
另一个示例,可以实现对请求进行日志记录:
public class LoggingInterceptor implements Interceptor {
public void destroy() {}
public void init() {}
public String intercept(ActionInvocation invocation) throws Exception {
long startTime = System.currentTimeMillis(); // 记录开始时间
/*在action执行前的逻辑*/
String result = invocation.invoke();
/*在action执行后的逻辑*/
long endTime = System.currentTimeMillis(); // 记录结束时间
long executeTime = endTime - startTime; // 计算action执行时间
String className = invocation.getAction().getClass().getName();
String methodName = invocation.getProxy().getMethod();
System.out.println(String.format("Class %s, Method %s, Execute Time: %dms", className, methodName, executeTime));
return result;
}
}
在struts.xml
配置文件中,配置拦截器及其拦截范围:
<interceptors>
<interceptor name="logging"
class="com.example.LoggingInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="logging"/>
<interceptor-ref name="params"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
<action name="foo" class="com.example.FooAction">
<interceptor-ref name="defaultStack"/>
<result name="success">/result.jsp</result>
</action>
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2实现对action请求对象的拦截操作方法 - Python技术站