后台系统中应该需要一个功能那就是将每个请求的url地址和请求的参数log出来,方便系统调试和bug追踪,使用struts2时可以使用struts2的全局拦截器实现此功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/** * 全局方法拦截器,用于log方法调用以及参数信息
*/
public class GloableLogInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = 1L;
private Logger log = Logger.getLogger( this .getClass());
@Override
public String intercept(ActionInvocation invocation) throws Exception {
if (log.isDebugEnabled()) {
HttpServletRequest request = (HttpServletRequest) invocation
.getInvocationContext().get(
ServletActionContext.HTTP_REQUEST);
this .logParameters(request);
}
return invocation.invoke();
}
/**
*
* @param request
*/
private void logParameters(HttpServletRequest request) {
Map<string, string[]= "" > params = request.getParameterMap();
if ( null == params || params.size() == 0 ) {
return ;
}
Set<string> keys = params.keySet();
Iterator<string> keysIt = keys.iterator();
StringBuffer container = new StringBuffer();
container.append( "requestUrl[url:" )
.append(request.getRequestURL().toString()).append( "]" )
.append( ",paremeters:[" );
while (keysIt.hasNext()) {
String key = keysIt.next();
String[] values = params.get(key);
StringBuffer str = new StringBuffer();
str.append(key).append( "=" );
if (values.length > 1 ) {
str.append( "{" );
for (String value : values) {
str.append(value).append( "," );
}
this .removeLastCharacter(str);
str.append( "}" );
} else
str.append(values[ 0 ]);
str.append( "," );
container.append(str.toString());
}
this .removeLastCharacter(container);
container.append( "]" );
log.debug(container.toString());
}
private void removeLastCharacter(StringBuffer buff) {
int len = buff.length();
buff.replace(len - 1 , len, StringUtils.EMPTY);
}
} </string></string></string,> |
这时我们还需要自定义拦截器链,这样就不需要在每个package中声明使用此拦截器,只要将需要的package继承我们带有日志拦截功能的拦截器即可!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<interceptors> <!--全局日志拦截器-->
<interceptor name= "gloableLogInterceptor" class = "gloableLogInterceptor" ></interceptor>
<interceptor-stack name= "defaultStack" >
<interceptor-ref name= "exception" >
<interceptor-ref name= "alias" >
<interceptor-ref name= "servletConfig" >
<interceptor-ref name= "i18n" >
<interceptor-ref name= "prepare" >
<interceptor-ref name= "chain" >
<interceptor-ref name= "scopedModelDriven" >
<interceptor-ref name= "modelDriven" >
<interceptor-ref name= "fileUpload" >
<interceptor-ref name= "checkbox" >
<interceptor-ref name= "multiselect" >
<interceptor-ref name= "staticParams" >
<interceptor-ref name= "actionMappingParams" >
<interceptor-ref name= "params" >
<param name= "excludeParams" >^action:.*,^method:.*
</interceptor-ref>
<!-- 在注入参数后进行拦截 -->
<interceptor-ref name= "gloableLogInterceptor" ></interceptor-ref>
<interceptor-ref name= "tokenInterceptor" ></interceptor-ref>
<interceptor-ref name= "conversionError" >
<interceptor-ref name= "validation" >
<param name= "excludeMethods" >input,back,cancel,browse
</interceptor-ref>
<interceptor-ref name= "workflow" >
<param name= "excludeMethods" >input,back,cancel,browse
</interceptor-ref>
<interceptor-ref name= "debugging" >
<interceptor-ref name= "deprecation" >
</interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-ref></interceptor-stack>
</interceptors> < default -interceptor-ref name= "defaultStack" ></ default -interceptor-ref>
|
相关推荐
在`struts.xml`中配置拦截器的方式有多种,包括指定特定Action的拦截器、全局拦截器等。以下是一个具体的例子: ```xml <package name="struts-shop" extends="struts-default"> ...
1. **配置全局拦截器**:除了为每个Action单独配置拦截器,还可以配置全局拦截器,这将在所有Action上生效。在`struts.xml`中: ```xml <package name="default" extends="struts-default"> ......
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
当请求到达Action时,Struts2会调用这个链上的所有拦截器,然后才执行实际的动作方法。通过在拦截器中实现权限验证,我们可以在用户尝试访问受保护资源之前检查其登录状态。 接下来,我们创建一个自定义的登录拦截...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
Struts2自定义拦截器的配置是Struts2框架中一个非常重要的功能,它允许开发者在Action执行前后插入自定义的逻辑,以实现如权限验证、日志记录、性能监控等多种需求。以下是对标题和描述中涉及的知识点的详细说明: ...
通过以上详细介绍,我们了解了Struts2中的拦截器和验证框架的基本概念、如何创建自定义拦截器以及如何配置拦截器和使用验证功能。这些知识点对于初学者来说非常重要,能够帮助他们更好地理解和使用Struts2框架。
全局拦截器是在struts.xml配置文件中定义的,它们会应用于所有Action或者指定的Action集。全局拦截器通常用于处理跨Action的需求,比如用户登录验证、性能监控等。创建全局自定义拦截器需要以下步骤: 1. **编写...
默认情况下,Struts2提供了一些预定义的拦截器,如`params`(处理请求参数)、`exception`(处理异常)、`i18n`(国际化支持)等。这些拦截器的执行顺序对整个应用的性能和功能有直接影响。 当一个请求到达Struts2...
Struts2之Action接收请求参数和拦截器详解 Struts2框架中的Action接收请求参数和拦截器详解是非常重要的知识点,本文将详细介绍Struts2之Action接收请求参数和拦截器详解的相关知识点。 一、Struts2框架中的Action...
在Struts2中,拦截器是实现业务逻辑和表示层之间解耦的关键组件,允许开发者在请求处理之前或之后执行额外的操作。拦截器通过插桩(Interception)机制增强了Action调用,可以实现如日志记录、权限验证、数据校验等...
在Struts2的配置文件(通常是struts.xml)中,你需要将自定义的拦截器添加到拦截器栈中,指定其执行顺序和其他拦截器的配合。例如: ```xml <!-- 其他拦截器 --> <!-- ... --> ``` 6. **前端...
全局拦截器栈适用于所有Action,而特定Action的配置可以覆盖全局设置,提供更细粒度的控制。 8. 示例代码: 自定义拦截器示例: ```java public class LoggingInterceptor extends AbstractInterceptor { @...
在Struts2中,拦截器是实现业务逻辑和表示层解耦的重要工具,它们允许开发者在请求到达Action之前或之后执行特定的操作。在这个实例中,我们将探讨如何创建一个自定义拦截器来处理未登录用户的非法请求。 首先,...
下面将详细阐述Struts2拦截器的配置过程、方法以及拦截器栈和默认拦截器的关系。 1. **Interceptor接口**: - `init()`方法:在服务器启动时被调用一次,用于初始化拦截器,一般用来进行一些配置加载或准备工作。 ...
拦截器是Struts2的核心特性之一,它在Action调用前后执行,提供了AOP(面向切面编程)的能力,允许开发者扩展和定制应用的行为,无需深入到每个Action的实现中。在本示例中,我们将探讨如何设置和使用Struts2的拦截...
Struts2 提供了两种拦截器的配置方式:XML 配置和注解配置。本例中采用了 XML 配置,因为它更适用于全局复用,避免了在每个 Action 中重复编写相同的注解。注解配置虽然方便,但只能应用于方法级别,不适合多处使用...
2. **全局变量(Global Variables)**:在Struts2中,全局变量通常是指在struts.xml配置文件中定义的可全局访问的对象,如常量、拦截器栈和结果类型。这些配置可以提高代码的复用性和可维护性。 3. **Action转化...
通过分析浪曦Struts2拦截器源码,我们可以学习如何编写和使用拦截器,理解Struts2的请求处理流程,以及如何通过拦截器优化和增强应用功能。这将有助于提升我们的Struts2开发技能,更好地应对实际项目中的挑战。 在...