日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-web源码解析之Filter-AbstractRequestLoggingFilter

發(fā)布時間:2025/3/17 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-web源码解析之Filter-AbstractRequestLoggingFilter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于4.1.7.RELEASE

Filter處理request log的基類,提供了在filterChain.doFilter調用前后的回調函數(shù),其實現(xiàn)類有CommonsRequestLoggingFilter,Log4jNestedDiagnosticContextFilter,ServletContextRequestLoggingFilter。

其核心代碼為doFilterInternal方法:

@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {boolean isFirstRequest = !isAsyncDispatch(request);HttpServletRequest requestToUse = request;if (isIncludePayload() && isFirstRequest && !(request instanceof ContentCachingRequestWrapper)) {requestToUse = new ContentCachingRequestWrapper(request);}boolean shouldLog = shouldLog(requestToUse);if (shouldLog && isFirstRequest) {beforeRequest(requestToUse, getBeforeMessage(requestToUse));}try {filterChain.doFilter(requestToUse, response);}finally {if (shouldLog && !isAsyncStarted(requestToUse)) {afterRequest(requestToUse, getAfterMessage(requestToUse));}} }

在調用filterChain.doFilter方法前后分別調用beforeRequest和afterRequest,而這兩個方法具體實現(xiàn)由子類決定,根據功能不同來決定記錄日志的方法,

在beforeRequest中和afterRequest中分別調用了? getBeforeMessage,getAfterMessage,這兩個方法代碼如下

private String getBeforeMessage(HttpServletRequest request) {return createMessage(request, this.beforeMessagePrefix, this.beforeMessageSuffix); }private String getAfterMessage(HttpServletRequest request) {return createMessage(request, this.afterMessagePrefix, this.afterMessageSuffix); }

最終都會進入到createMessage中去,只是前綴后綴不同,

before的Msg格式是: Before request [? Msg? ]

after的Msg格式是 : After request [? Msg? ]

這里的Msg具體內容則由createMessage決定

protected String createMessage(HttpServletRequest request, String prefix, String suffix) {StringBuilder msg = new StringBuilder();msg.append(prefix);msg.append("uri=").append(request.getRequestURI());if (isIncludeQueryString()) {msg.append('?').append(request.getQueryString());}if (isIncludeClientInfo()) {String client = request.getRemoteAddr();if (StringUtils.hasLength(client)) {msg.append(";client=").append(client);}HttpSession session = request.getSession(false);if (session != null) {msg.append(";session=").append(session.getId());}String user = request.getRemoteUser();if (user != null) {msg.append(";user=").append(user);}}if (isIncludePayload() && request instanceof ContentCachingRequestWrapper) {ContentCachingRequestWrapper wrapper = (ContentCachingRequestWrapper) request;byte[] buf = wrapper.getContentAsByteArray();if (buf.length > 0) {int length = Math.min(buf.length, getMaxPayloadLength());String payload;try {payload = new String(buf, 0, length, wrapper.getCharacterEncoding());}catch (UnsupportedEncodingException e) {payload = "[unknown]";}msg.append(";payload=").append(payload);}}msg.append(suffix);return msg.toString(); }

根據具體的參數(shù)設置的不同,其表現(xiàn)出不同的形式,msg的最基本格式為

Before/After request [? uri=xxx? ]

設置includeQueryString=true:

Before/After request [? uri=xxx?a=xx&b=xxx? ]

設置includeClientInfo=true:

Before/After request [? uri=xxx?a=xxx&b=xxx;client=xxx;session=sessionId;user=xxx? ]

設置includePayload=true:

先判斷request的content的長度,如果超過設置maxPayload的長度,則按照maxPayload進行截取,如果出現(xiàn)異常,則payload=[unknown]

Before/After request [? uri=xxx?a=xxx&b=xxx;client=xxx;session=sessionId;user=xxx;payload=xxx/[unknown]? ]

下面來看其子類對應的不同的實現(xiàn)

CommonsRequestLoggingFilter: @Override protected boolean shouldLog(HttpServletRequest request) {return logger.isDebugEnabled(); }@Override protected void beforeRequest(HttpServletRequest request, String message) {logger.debug(message); }@Override protected void afterRequest(HttpServletRequest request, String message) {logger.debug(message); }

其主要是調用初始化時候設置的GenericFilterBean中的logger進行記錄。

Log4jNestedDiagnosticContextFilter:

其采用了Log4j來進行日志記錄。自定義變量

protected final Logger log4jLogger = Logger.getLogger(getClass());

ServletContextRequestLoggingFilter:

使用ServletContext來記錄日志


總結

以上是生活随笔為你收集整理的Spring-web源码解析之Filter-AbstractRequestLoggingFilter的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。