后台系统中应该需要一个功能那就是将每个请求的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) { Mapparams = request.getParameterMap(); if (null == params || params.size() == 0) { return; } Set keys = params.keySet(); Iterator 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继承我们带有日志拦截功能的拦截器即可!
^action:.*,^method:.* input,back,cancel,browse input,back,cancel,browse