struts2 全局拦截器,显示请求方法和參数

后台系统中应该须要一个功能那就是将每一个请求的url地址和请求的參数log出来,方便系统调试和bug追踪,使用struts2时能够使用struts2的全局拦截器实现此功能:

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);
	}
}

这时我们还须要自己定义拦截器链,这样就不须要在每一个package中声明使用此拦截器。仅仅要将须要的package继承我们带有日志拦截功能的拦截器就可以!

		<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:.*</param>
				</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</param>
				</interceptor-ref>
				<interceptor-ref name="workflow">
					<param name="excludeMethods">input,back,cancel,browse</param>
				</interceptor-ref>
				<interceptor-ref name="debugging" />
				<interceptor-ref name="deprecation" />
			</interceptor-stack>
		</interceptors>

		<default-interceptor-ref name="defaultStack"></default-interceptor-ref>
	</package>
时间: 2024-08-02 02:44:44

struts2 全局拦截器,显示请求方法和參数的相关文章

struts2 全局拦截器,显示请求方法和参数

后台系统中应该需要一个功能那就是将每个请求的url地址和请求的参数log出来,方便系统调试和bug追踪,使用struts2时可以使用struts2的全局拦截器实现此功能: import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; im

Struts2自定义拦截器的基本方法

struts.xml struts2配置文件,因为我们为Action配置了拦截器,默认的拦截器就会失效.为了程序的正常运行,需要我们显示引入默认拦截器. 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "

说说struts2中拦截器的请求流程一(模拟大致流程)

本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让action在运行之前干什么就能干什么,而且action本身并"不知道"自己被拦截了. 文章主要分析了拦截器部分的流程,对于环境的获取与初始化并没有涉及,对这部分感兴趣的朋友可以参考 http://www.cnblogs.com/liuling/p/2013-8-10-01.html 在真

Struts2拦截器、拦截器栈(Interceptor Stack)、全局拦截器与方法拦截器

Struts2拦截器原理 Struts2拦截器是在访问某个Action或Action的方法之前或之后实施拦截.在请求Struts2的Action时,Struts2会查找配置文件,并根据配置文件实例化相应的拦截器对象. Struts2拦截器配置 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Found

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

Struts2默认拦截器栈及内建拦截器使用详解

Struts2内建拦截器介绍: alias (别名拦截器):允许参数在跨越多个请求时使用不同别名,该拦截器可将多个Action采用不同名字链接起来,然后用于处理同一信息. autowiring (自动装配拦截器):主要用于当Struts2和Spring整合时,Struts2可以使用自动装配的方式来访问Spring容器中的Bean. chain (链拦截器):构建一个Action链,使当前Action可以访问前一个Action的属性,一般和<result type="chain"

Struts2(四) 拦截器

一.struts2国际化 定义:同一款软件 可以为不同用户,提供不同语言界面 第一种 全局国际化信息文件 (所有Action都可以使用 ) ------- 最常用 1.properties文件可以在任何包中2. 需要在struts.xml 中配置全局信息文件位置 <!-- messages.properties 在src根目录 --> <constant name="struts.custom.i18n.resources" value="messages&

struts2 在拦截器进行注入(根据Action是否实现自定义接口)

例如:常常在Action中都需要获取当前登录的User,就需要获取Session,然后从Session获取当前登录的User,因为这些步骤都是重复操作,可以想办法在拦截器中进行实现,可以自定义一个接口,只要你的Action实现了这个接口,就在自定义拦截器中进行注入.即从拦截器中获取Session,然后设置进行注入. 简单的例子: 一个自定义接口,只要Action实现这个接口,就在拦截器中进行注入 package com.atguigu.surveypark.struts2; import com

【struts2】拦截器基础

1)拦截器是什么? 拦截器(Interceptor)是Struts2最强大的特性之一,它是一种可以让你在Action执行之前和Result执行之后进行一些功能处理的机制.来回顾一下官方给出的Struts2系统架构图中关于拦截器的部分,如下图所示: 这个图清晰的描述出了拦截器的运行地位,就是用来负责在Action执行之前和Result执行之后处理一些功能的类.也就是说,上图示意了有3个拦截器的类,分别是Interceptor1.Interceptor2和Interceptor3,它们分别执行不同的