struts2 全局攔截器,顯示請求方法和參數
阿新 • • 發佈:2017-06-16
功能 defaults i18n token override params tin back alias
這時我們還須要自己定義攔截器鏈,這樣就不須要在每一個package中聲明使用此攔截器。僅僅要將須要的package繼承我們帶有日誌攔截功能的攔截器就可以!
後臺系統中應該須要一個功能那就是將每一個請求的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 全局攔截器,顯示請求方法和參數