1. 程式人生 > >struts2 全局攔截器,顯示請求方法和參數

struts2 全局攔截器,顯示請求方法和參數

功能 defaults i18n token override params tin back alias

後臺系統中應該須要一個功能那就是將每一個請求的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>


struts2 全局攔截器,顯示請求方法和參數