{"id":910,"date":"2018-09-17T18:17:23","date_gmt":"2018-09-17T09:17:23","guid":{"rendered":"https:\/\/chat-messenger.com\/?p=910"},"modified":"2018-12-23T02:01:26","modified_gmt":"2018-12-22T17:01:26","slug":"http-log-filter","status":"publish","type":"post","link":"https:\/\/chat-messenger.com\/ko\/blog\/java\/http-log-filter","title":{"rendered":"Java \ub85c\uadf8 \ud544\ud130\ub85c HTTP \uad6c\ubb38 \ubd84\uc11d"},"content":{"rendered":"<h2 class=\"common_title\"><a name=\"0\">Java \ub85c\uadf8 \ud544\ud130\ub85c HTTP \uc694\uccad \uad6c\ubb38 \ubd84\uc11d<\/a><\/h2>\n<p>\n<strong>javax.servlet.Filter<\/strong>\uad6c\ud604\ud558\uc5ec HTTP \uc694\uccad \ub0b4\uc6a9\uc744 \uad6c\ubb38 \ubd84\uc11d\ud558\uace0 \ub85c\uadf8\ub97c \ucd9c\ub825\ud558\ub294 \ud3b8\ub9ac\ud55c<strong>\ud544\ud130<\/strong>\uc218\uc5c5\uc744 \uc18c\uac1c\ud569\ub2c8\ub2e4.<br \/>\n<br \/>\n\uc774 \ub85c\uadf8 \ud544\ud130\ub294, \ub85c\uadf8 \ucd9c\ub825\uc5d0 \u300cjava.util.logging.Logger\u300d\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc5b4, \ub85c\uadf8 \ub808\ubca8\uc744 \ubcc0\uacbd\ud558\ub294 \uac83\uc73c\ub85c \ucd9c\ub825\ud558\ub294 \uc815\ubcf4\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<h2 class=\"common_title\"><a name=\"1\">javax.servlet.Filter\ub780?<\/a><\/h2>\n<p>\n\uc6f9 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158 \uad6c\ucd95\uc5d0 \uc788\uc5b4\uc11c, \uba54\uc778\uc774 \ub418\ub294 \uc5c5\ubb34 \ucc98\ub9ac \uc678\uc5d0, \uadf8 \uc804\ud6c4\ub85c \uacf5\ud1b5\ub41c \ubd80\ucc28\uc801\uc778 \ucc98\ub9ac\ub97c \uc2e4\uc2dc\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uc608\ub97c \ub4e4\uba74, \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc778\uc99d\uc774\ub098, \uad8c\ud55c \uccb4\ud06c, \ub85c\uae45\ub4f1\uc785\ub2c8\ub2e4.<br \/>\n\uc774\ub7ec\ud55c \ubd80\ucc28\uc801\uc778 \ucc98\ub9ac\ub97c \uac01\uac01\uc758 \ub9ac\uc18c\uc2a4\ub85c \ucf54\ub529\ud558\uba74, \uc18c\ud504\ud2b8\uc6e8\uc5b4\uc758 \ubcf4\uc218\uc131\uc744 \ubc29\ud574\ud558\ub294 \ud070 \uc6d0\uc778\uc774 \ub418\uc5b4, \uba54\uc778\ud130\ub10c\uc2a4\uc758 \uace4\ub780\ud55c \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub418\uc5b4 \ubc84\ub9bd\ub2c8\ub2e4.<\/p>\n<p>javax.servlet.Filter \ub97c \uad6c\ud604\ud558\uba74, \ub9ac\ud018\uc2a4\uac00 \uc11c\ube14\ub9bf \ud074\ub798\uc2a4\uc5d0 \uac74\ub124\uc9c0\uae30 \uc804\uc5d0, \uc774 \ubd80\ucc28\uc801\uc778 \ucc98\ub9ac\ub97c, \uacf5\ud1b5\uc801\uc73c\ub85c \uc2e4\ud589\uc2dc\ud0ac \uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\ub610 \ud544\ud130\uc758 \uc124\uc815\uc740 web.xml\ub85c \ud560 \uc218 \uc788\uc73c\ubbc0\ub85c, \uc18c\uc2a4 \ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\uc9c0 \uc54a\uace0, \ud544\ud130\ub97c \ucd94\uac00\ud558\uac70\ub098 \uc0ad\uc81c\ud558\ub294 \uac83\uc774 \uc720\uc5f0\ud558\uac8c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/chat-messenger.com\/js\/common.js?dd12sssas2223\" charset=\"UTF-8\"><\/script><br \/>\n<script type=\"text\/javascript\"> writePR(); <\/script><\/p>\n<h2 class=\"common_title\"><a name=\"2\">\ub85c\uadf8 \ud544\ud130\ub97c \uc0ac\uc6a9\ud574\ubcf4\uae30<\/a><\/h2>\n<p>HTTP \uc694\uccad\uc5d0 \ud544\ud130\ub97c \ud1b5\ud574 HTTP \uc694\uccad\uc744 \uad6c\ubb38 \ubd84\uc11d\ud558\ub294 \ub85c\uadf8 \ud544\ud130\ub97c \uc2e4\uc81c\ub85c \uc0ac\uc6a9\ud574 \ubd05\uc2dc\ub2e4.<br \/>\n\uc774\ubc88\uc5d0\ub294<a href=\"http:\/\/tomcat.apache.org\/\" target=\"_blank\">Tomcat<\/a>\ucc98\uc74c\ubd80\ud130 examples \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<br \/>\n\ub2e4\uc74c \uc124\uc815\uc744 \uc218\ud589\ud558\uba74 \uc774 \ud544\ud130\ub97c \uc989\uc2dc \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<div class=\"point\">\n1.<a href=\"#4\"><strong>\uc18c\uc2a4 \ucf54\ub4dc<\/strong><\/a>\uac00\uc838\uc640 \ucef4\ud30c\uc77c\ud569\ub2c8\ub2e4.<br \/>\n2. \ucef4\ud30c\uc77c\ub41c \ud074\ub798\uc2a4 \ud30c\uc77c\uc744 \/examples\/WEB-INF\/classes \uc544\ub798\uc5d0 \ub193\uc2b5\ub2c8\ub2e4.<br \/>\n3.web.xml\uc5d0 \ub2e4\uc74c \uc815\uc758\ub97c \uc124\uc815\ud55c\ub2e4.\n<\/div>\n<pre class=\"sample_src\">  LogFilter LogFilter logging.Level FINE LogFilter \/*\r\n<\/pre>\n<p>\u203bStruts \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud588\uc744 \uacbd\uc6b0\uc758 url-pattern\uc740 \uc774\ud558\uac00 \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"sample_src\">   *.do\r\n<\/pre>\n<p>\nSessions Example \ud654\uba74\uc744 \uc2e4\ud589\ud55c \ub85c\uadf8 \ucd9c\ub825 \uacb0\uacfc\ub97c \ud655\uc778\ud574 \ubcf4\uc2ed\uc2dc\uc624.<br \/>\n<img src=\"https:\/\/chat-messenger.com\/images\/SessionsExample.jpg\" alt=\"javax.servlet.Filter \ub85c\uadf8 \ud544\ud130\ub85c \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubd84\uc11d\" border=\"0\"><br \/>\n<br clear=\"all\"><\/p>\n<h2 class=\"common_title\"><a name=\"3\">\ucd9c\ub825\ud560 \ub85c\uadf8 \uc815\ubcf4\uc640 \ub85c\uadf8 \ub808\ubca8<\/a><\/h2>\n<p><strong>\u25cf \ub85c\uadf8 \ucd9c\ub825 \ub0b4\uc6a9<\/strong><\/p>\n<table border=\"1\">\n<tbody>\n<tr bgcolor=\"#FFFF80\">\n<th>\ub85c\uadf8 \uc815\ubcf4<\/th>\n<th>\ub85c\uadf8 \ub808\ubca8<\/th>\n<\/tr>\n<tr>\n<td><strong>\ucfe0\ud0a4 \uc815\ubcf4<\/strong><\/td>\n<td>FINE<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP \ud5e4\ub354 \uc815\ubcf4<\/strong><\/td>\n<td>FINE<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP \uae30\ud0c0 \uc815\ubcf4<\/strong><\/td>\n<td>FINE<\/td>\n<\/tr>\n<tr>\n<td><strong>HTTP \uc694\uccad \ub9e4\uac1c\ubcc0\uc218<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>request \ubc94\uc704\uc758 \uac1d\uccb4<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>session \ubc94\uc704\uc758 \uac1d\uccb4<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>\uc694\uccad \uc804\ud6c4\uc758 \uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9<\/strong><\/td>\n<td>CONFIG<\/td>\n<\/tr>\n<tr>\n<td><strong>\ud654\uba74 \uc804\ud658 \uc815\ubcf4<\/strong><\/td>\n<td>INFO<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n<p>\ub85c\uadf8 \ub808\ubca8\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ubd84\ud558\uba74 \uc88b\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<ul>\n<li>FINE ... \uac00\uc7a5 \uc0c1\uc138\ud55c \ub85c\uadf8\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. HTTP \uc694\uccad\uc744 \uc790\uc138\ud788 \ud30c\uc2f1\ud558\ub824\ub294 \uacbd\uc6b0 \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<li>CONFIG\u30fb\u30fb\u30fb\uc57d\uac04\uc758 \uc0c1\uc138\ud55c \ub85c\uadf8\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. \uac1c\ubc1c \uae30\uac04 \ub3d9\uc548\uc774 \uc218\uc900\uc73c\ub85c \uc124\uc815\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4.<\/li>\n<li>INFO \u00b7\u00b7\u00b7\u00b7 \ud654\uba74 \ucc9c\uc774 \uc815\ubcf4\ub9cc\uc744 \ucd9c\ub825\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><strong>\u25cf \ub85c\uadf8 \ub808\ubca8 \ubcc0\uacbd \ubc29\ubc95<\/strong><br \/>\n\ucd08\uae30\ud654 \ub9e4\uac1c\ubcc0\uc218 logging.Level\uc744 \uc124\uc815\ud558\uc5ec \ub85c\uadf8\uc758 \ucd9c\ub825 \ub808\ubca8\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n\uc608:<\/p>\n<pre class=\"sample_src\">   logging.Level INFO\r\n<\/pre>\n\n<h2 class=\"common_title\"><a name=\"4\">\uc18c\uc2a4 \ucf54\ub4dc<\/a><\/h2>\n<p><textarea readonly=\"readonly\" style=\"font-size: 13px;height: 400px;\" class=\"src\" onclick=\"this.focus();this.select()\">import java.io.IOException;<br \/>\nimport java.io.UnsupportedEncodingException;<br \/>\nimport java.sql.Time;<br \/>\nimport java.text.DecimalFormat;<br \/>\nimport java.text.SimpleDateFormat;<br \/>\nimport java.util.Date;<br \/>\nimport java.util.Enumeration;<br \/>\nimport java.util.Hashtable;<br \/>\nimport java.util.Iterator;<br \/>\nimport java.util.Map;<br \/>\nimport java.util.TreeMap;<br \/>\nimport java.util.logging.Formatter;<br \/>\nimport java.util.logging.Handler;<br \/>\nimport java.util.logging.Level;<br \/>\nimport java.util.logging.LogManager;<br \/>\nimport java.util.logging.LogRecord;<br \/>\nimport java.util.logging.Logger;<br \/>\nimport java.util.logging.StreamHandler;<\/p>\n<p>import javax.servlet.Filter;<br \/>\nimport javax.servlet.FilterChain;<br \/>\nimport javax.servlet.FilterConfig;<br \/>\nimport javax.servlet.ServletException;<br \/>\nimport javax.servlet.ServletRequest;<br \/>\nimport javax.servlet.ServletResponse;<br \/>\nimport javax.servlet.http.Cookie;<br \/>\nimport javax.servlet.http.HttpServletRequest;<br \/>\nimport javax.servlet.http.HttpServletResponse;<br \/>\nimport javax.servlet.http.HttpSession;<\/p>\n<p>\/**<br \/>\n * javax.servlet.Filter\ub97c \uad6c\ud604\ud558\uc5ec HTTP \uc694\uccad\uc758 \ub0b4\uc6a9\uc744 \uad6c\ubb38 \ubd84\uc11d\ud558\uace0 \ub85c\uadf8\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4.<br \/>\n * Filter \ud074\ub798\uc2a4.<br \/>\n *\/<br \/>\npublic class LogFilter implements Filter {<\/p>\n<p>    private static Logger logger =<br \/>\n        Logger.getLogger(LogFilter.class.getName());<br \/>\n    private static final String LINE_SEPA =<br \/>\n        System.getProperty(\u201cline.separator\u201d);<br \/>\n    private static final String NEXT_PAGE = \u201cLogFilter.NEXT_PAGE\u201d;<\/p>\n<p>    \/**<br \/>\n     * \uc774 \ub85c\uadf8 \ud544\ud130\ub97c \ucd08\uae30\ud654\ud569\ub2c8\ub2e4.<br \/>\n     * @param mapping<br \/>\n     *\/<br \/>\n    public void init (FilterConfig mapping) {<br \/>\n        String str = mapping.getInitParameter(&quot;logging.Level&quot;);<br \/>\n        System.out.println(\u201c\ub85c\uadf8 \uc218\uc900\uc744\u201d+str+\u201d\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.\u201d);<br \/>\n        Level level = null;<br \/>\n        try {<br \/>\n            level = Level.parse(str);<br \/>\n        } catch (Exception e) {<br \/>\n            e.printStackTrace();<br \/>\n            level = Level.INFO;<br \/>\n        }<br \/>\n        LogManager.getLogManager().reset();<br \/>\n        Handler handler = new CustomConsoleHandler();<br \/>\n        handler.setFormatter(new CustomFormatter());<br \/>\n        handler.setLevel (level);<br \/>\n        logger.setLevel(level);<br \/>\n        logger.getParent().addHandler(handler);<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * \ub85c\uadf8\ub97c \ucd9c\ub825\ud558\ub294 \ud544\ud130\uc785\ub2c8\ub2e4.<br \/>\n     * @param request \ucc98\ub9ac\uc911\uc778 HTTP \uc694\uccad<br \/>\n     * @param response \uc0dd\uc131 \uc911 HTTP \uc751\ub2f5<br \/>\n     * @param \uccb4\uc778<br \/>\n     *\/<br \/>\n    public void doFilter (ServletRequest _request, ServletResponse _response,<br \/>\n            FilterChain \uccb4\uc778) throws IOException, ServletException {<\/p>\n<p>        \/\/ \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 \u300e \uc804\ucc98\ub9ac \u300f<br \/>\n        HttpServletRequest request = (HttpServletRequest) _request;<br \/>\n        HttpServletResponse response = (HttpServletResponse) _response;<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config (<br \/>\n                \u201c============ Request Start !! \u201d<br \/>\n                +\u201dThread ID:\u201d<br \/>\n                + Thread.currentThread().hashCode()<br \/>\n                + &#8221; ========================================================&#8221;);<br \/>\n        }<br \/>\n        \/\/ \uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9<br \/>\n        String actionMemory = null;<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            actionMemory = getMemoryInfo(\u201d \u201d<br \/>\n                    + new Time(System.currentTimeMillis()) + &quot;\uc694\uccad[\uc774\uc804]&quot;);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            logger.fine(&quot;\ucfe0\ud0a4 \uc815\ubcf4&quot; + getCookieInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            logger.fine(&quot;HTTP \ud5e4\ub354 \uc815\ubcf4&quot; + getHeadersInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.FINE)) {<br \/>\n            \ub85c\uac70<br \/>\n                    .fine(\u201cHTTP \uae30\ud0c0 \uc815\ubcf4\u201d + getRequestOtherInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String reqlog = getRequestParametersInfo(request);<br \/>\n            logger.config(\u201cHTTP \uc694\uccad \ud30c\ub77c\ubbf8\ud130\u201d + reqlog);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config(\u201crequest \ubc94\uc704\uc758 \uac1d\uccb4\u201d<br \/>\n                    + getRequestAttributeInfo(request));<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String sessionlog = getSessionInfo(request,true);<br \/>\n            logger.config ( &quot;session \ubc94\uc704\uc758 \uac1d\uccb4 (\uc694\uccad \ucc98\ub9ac \uc804)&quot;<br \/>\n                    + sessionlog);<br \/>\n        }<\/p>\n<p>        \/\/ \ub2e4\uc74c \ud544\ud130 \ud638\ucd9c<br \/>\n        chain.doFilter (request, response);<\/p>\n<p>        \/\/ \u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014 \u300e\ud6c4\ucc98\ub9ac\u300f<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            String sessionlog = getSessionInfo(request,false);<br \/>\n            logger.config(\u201csession \ubc94\uc704\uc758 \uac1d\uccb4(\uc694\uccad \ucc98\ub9ac \ud6c4)\u201d)<br \/>\n                    + sessionlog);<br \/>\n        }<br \/>\n        \/\/ \uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            actionMemory = &quot;\uc694\uccad \uc804\ud6c4\uc758 \uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9&quot;+LINE_SEPA<br \/>\n                    +actionMemory +LINE_SEPA<br \/>\n                    + getMemoryInfo(\u201d \u201d + new Time(System.currentTimeMillis())<br \/>\n                            + &quot;\uc694\uccad [\ud6c4]&quot;);<br \/>\n            logger.config(actionMemory+LINE_SEPA);<\/p>\n<p>        }<br \/>\n        \/\/ \ud654\uba74 \uc804\ud658 \uc815\ubcf4<br \/>\n        if (logger.isLoggable(Level.INFO)) {<br \/>\n            String nextPage = (String) request.getAttribute(NEXT_PAGE);<br \/>\n            if (nextPage == null || nextPage.length() == 0) {<br \/>\n                nextPage = request.getRequestURI();<br \/>\n            }<br \/>\n            logger.info(\u201cNEXT_PAGE=[\u201d + nextPage + \u201c], \u201d<br \/>\n                    + \u201cIP_ADDRESS=[\u201d + request.getRemoteAddr() + \u201c], \u201d<br \/>\n                    + \u201cSESSION_ID=[\u201d + request.getSession().getId() + \u201c], \u201d<br \/>\n                    + \u201cUSER-AGENT=[\u201d + request.getHeader(\u201cuser-agent\u201d) + \u201c]\u201d);<br \/>\n        }<br \/>\n        if (logger.isLoggable(Level.CONFIG)) {<br \/>\n            logger.config (<br \/>\n                \u201c============ Request End !! \u201d<br \/>\n                +\u201dThread ID:\u201d+ Thread.currentThread().hashCode()<br \/>\n                + &#8221; =========================================================&#8221;<br \/>\n                +LINE_SEPA+LINE_SEPA);<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     *<br \/>\n     *\/<br \/>\n    public void destroy() {<br \/>\n    }<\/p>\n<p>    \/\/ \uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d\uff0d \uc774\ud558 \ud504\ub77c\uc774\ube57 \uba54\uc18c\ub4dc<br \/>\n    private static String getMemoryInfo (String message) {<br \/>\n        DecimalFormat dFromat = new DecimalFormat(\u201c#,###KB\u201d);<br \/>\n        long free = Runtime.getRuntime().freeMemory() \/ 1024;<br \/>\n        long total = Runtime.getRuntime().totalMemory() \/ 1024;<br \/>\n        long max = Runtime.getRuntime().maxMemory() \/ 1024;<br \/>\n        long used = total \u2013 free;<br \/>\n        String msg = message + \u201d : \u201d + \u201c\ucd1d =\u201d + dFromat.format(total) + \u201c, \u201d<br \/>\n                + \u201c\uc0ac\uc6a9\ub7c9 =\u201d + dFromat.format(used) + \u201d (\u201d + (used * 100 \/ total)<br \/>\n                + \u201c%), \uc0ac\uc6a9 \uac00\ub2a5 \ucd5c\ub300 =\u201d + dFromat.format(max);<br \/>\n        return msg;<br \/>\n    }<br \/>\n    \/**<br \/>\n     * \ubaa8\ub4e0 \uc694\uccad \ud5e4\ub354\ub97c \ub85c\uadf8\uc5d0 \ucd9c\ub825\ud569\ub2c8\ub2e4.<br \/>\n     *\/<br \/>\n    private static String getHeadersInfo (HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Enumeration headerNames = request.getHeaderNames();<br \/>\n        while (headerNames.hasMoreElements()) {<br \/>\n            String headerName = (String) headerNames.nextElement();<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(headerName);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(request.getHeader(headerName));<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getCookieInfo (HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        Cookie[] cookies = request.getCookies();<br \/>\n        if (cookies == null) {<br \/>\n            return \u201c\u201d;<br \/>\n        }<br \/>\n        for (int i = 0; i &lt; cookies.length; i++) {<br \/>\n            buff.append(\u201c\\n \u2014 Cookie[\u201d + i + \u201c] \u2014\\n\u201d);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(cookies[i].getName());<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getValue());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetVersion()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getVersion());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetComment()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getComment());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetDomain()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getDomain());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetMaxAge()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getMaxAge());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetPath()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getPath());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(\u201cgetSecure()\u201d);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            buff.append(cookies[i].getSecure());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestParametersInfo (HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Map map = convertRequest(request);<br \/>\n        TreeMap trr = new TreeMap(map);<br \/>\n        Iterator itr = trr.keySet().iterator();<br \/>\n        while (itr.hasNext()) {<br \/>\n            String key = (String) itr.next();<br \/>\n            buff.append(\u201d \u201c);<br \/>\n            buff.append(key);<br \/>\n            buff.append(\u201c=\u201d);<br \/>\n            Object value = map.get(key);<br \/>\n            String[] values = (String[]) value;<br \/>\n            if (values.length == 1) {<br \/>\n                buff.append(values[0]);<br \/>\n            } else {<br \/>\n                \/\/ String \ubc30\uc5f4\uc740 \ubcc0\ud658\ud55c\ub2e4<br \/>\n                String strValue = stratum(values);<br \/>\n                buff.append(strValue);<br \/>\n            }<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestAttributeInfo (HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer(LINE_SEPA);<br \/>\n        Enumeration e = request.getAttributeNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String name = (String) e.nextElement();<br \/>\n            buff.append(\u201d name=\u201d + name + \u201c, attributeClass= \u201d<br \/>\n                    + request.getAttribute(name).getClass().getName()<br \/>\n                    + \u201c, toString() = \u201d + request.getAttribute(name)<br \/>\n                    +LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<br \/>\n    private static String getRequestOtherInfo (HttpServletRequest request) {<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getCharacterEncoding()=\u201d);<br \/>\n        buff.append(request.getCharacterEncoding());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getContentLength()=\u201d);<br \/>\n        buff.append(request.getContentLength());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getContentType()=\u201d);<br \/>\n        buff.append(request.getContentType());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getLocale()=\u201d);<br \/>\n        buff.append(request.getLocale());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getProtocol()=\u201d);<br \/>\n        buff.append(request.getProtocol());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getRemoteAddr()=\u201d);<br \/>\n        buff.append(request.getRemoteAddr());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getRemoteHost()=\u201d);<br \/>\n        buff.append(request.getRemoteHost());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getScheme()=\u201d);<br \/>\n        buff.append(request.getScheme());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getServerName()=\u201d);<br \/>\n        buff.append(request.getServerName());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getServerPort()=\u201d);<br \/>\n        buff.append(request.getServerPort());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d isSecure()=\u201d);<br \/>\n        buff.append(request.isSecure());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getAuthType()=\u201d);<br \/>\n        buff.append(request.getAuthType());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getContextPath()=\u201d);<br \/>\n        buff.append(request.getContextPath());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getMethod()=\u201d);<br \/>\n        buff.append(request.getMethod());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getPathInfo()=\u201d);<br \/>\n        buff.append(request.getPathInfo());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getPathTranslated()=\u201d);<br \/>\n        buff.append(request.getPathTranslated());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getQueryString()=\u201d);<br \/>\n        buff.append(request.getQueryString());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getRemoteUser()=\u201d);<br \/>\n        buff.append(request.getRemoteUser());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getRequestedSessionId()=\u201d);<br \/>\n        buff.append(request.getRequestedSessionId());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getRequestURI()=\u201d);<br \/>\n        buff.append(request.getRequestURI());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getServletPath()=\u201d);<br \/>\n        buff.append(request.getServletPath());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d getUserPrincipal()=\u201d);<br \/>\n        buff.append(request.getUserPrincipal());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d isRequestedSessionIdFromCookie()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdFromCookie());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d isRequestedSessionIdFromURL()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdFromURL());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        buff.append(\u201d isRequestedSessionIdValid()=\u201d);<br \/>\n        buff.append(request.isRequestedSessionIdValid());<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    private static String getSessionInfo (HttpServletRequest request,boolean before) {<br \/>\n        HttpSession session = request.getSession();<br \/>\n        StringBuffer buff = new StringBuffer();<br \/>\n        buff.append(LINE_SEPA);<br \/>\n        if (before) {<br \/>\n            buff.append(\u201d session.isNew() = \u201d + session.isNew());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n            buff.append(\u201d session.getId() = \u201d + session.getId());<br \/>\n            buff.append(LINE_SEPA);<br \/>\n        }<br \/>\n        Enumeration e = session.getAttributeNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String sessionName = (String) e.nextElement();<br \/>\n            String sessionClassName = session.getAttribute(sessionName)<br \/>\n                    .getClass().getName();<br \/>\n            buff.append(\u201d name =\u201d + sessionName + \u201c, value =\u201d<br \/>\n                    + session.getAttribute(sessionName) + \u201c, attributeClass = \u201d<br \/>\n                    + sessionClassName + LINE_SEPA);<br \/>\n        }<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    private static Hashtable convertRequest (HttpServletRequest request) {<br \/>\n        Hashtable tempHash = new Hashtable();<br \/>\n        Enumeration e = request.getParameterNames();<br \/>\n        while (e.hasMoreElements()) {<br \/>\n            String key = (String) e.nextElement();<br \/>\n            String[] values = request.getParameterValues(key);<br \/>\n            String[] parameterValues = new String[values.length];<br \/>\n            for(int i = 0; i &lt; values.length; i++) {<br \/>\n                parameterValues[i] = convUnicode(values[i]);<br \/>\n            }<br \/>\n            tempHash.put(key, parameterValues);<br \/>\n        }<br \/>\n        return tempHash;<\/p>\n<p>    }<br \/>\n    private static String stratum(Object value) {<br \/>\n        if (value == null) {<br \/>\n            return \u201cnull\u201d;<br \/>\n        } else if (value instanceof String[]) {<br \/>\n            return convString((String[]) value);<br \/>\n        } else {<br \/>\n            return value.toString();<br \/>\n        }<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * \ubb38\uc790\uc5f4 \ubc30\uc5f4 [strArray]\uc758 \ub0b4\uc6a9\uc744 \uc544\ub798\uc640 \uac19\uc740 String\ub85c \ubc18\ud658\ud569\ub2c8\ub2e4.<br \/>\n     * \u201c[temp1,temp2,temp3]\u201d<br \/>\n     * @param strArray \ud3c9\uac00 \ub300\uc0c1\uc758 String \ubc30\uc5f4<br \/>\n     * @return \ubcc0\ud658 \ud6c4 \ubb38\uc790\uc5f4<br \/>\n     *\/<br \/>\n    private static String convString (String [] strArray) {<br \/>\n        if (strArray == null)<br \/>\n            return null;<br \/>\n        StringBuffer buff = new StringBuffer(\u201c[\u201c);<br \/>\n        for (int i = 0; i &lt; strArray.length; i++) {<br \/>\n            buff.append(strArray[i] + \u201c, \u201c);<br \/>\n        }<br \/>\n        buff.delete(buff.length() \u2013 2, buff.length());<br \/>\n        buff.append(\u201c]\u201d);<br \/>\n        return buff.toString();<br \/>\n    }<\/p>\n<p>    \/**<br \/>\n     * [str]\uc744 \uc720\ub2c8\ucf54\ub4dc\ub85c \ubcc0\ud658\ud569\ub2c8\ub2e4.<br \/>\n     * @param str<br \/>\n     * @return<br \/>\n     *\/<br \/>\n    private static String convUnicode (String str) {<br \/>\n        if (str == null)<br \/>\n            return null;<br \/>\n        try {<br \/>\n            return new String(str.getBytes(\u201c8859_1\u201d), \u201cJISAutoDetect\u201d);<br \/>\n        } catch (UnsupportedEncodingException e) {<br \/>\n            throw new RuntimeException(e);<br \/>\n        }<br \/>\n    }<br \/>\n    \/\/ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n    static class CustomFormatter extends Formatter {<br \/>\n        static final String pattern = \u201cyyyy\/MM\/dd HH:mm:ss\u201d;<br \/>\n        public synchronized String format(LogRecord record) {<br \/>\n            StringBuffer buf = new StringBuffer();<br \/>\n            \/\/ \ub0a0\uc9dc \ubc0f \uc2dc\uac04 \uc124\uc815<br \/>\n            Date date = new Date();<br \/>\n            date.setTime(record.getMillis());<br \/>\n            SimpleDateFormat formatter = new SimpleDateFormat(pattern);<br \/>\n            buf.append(formatter.format(date));<br \/>\n            buf.append(\u201c:\u201d);<br \/>\n            \/\/ \ub808\ubca8 \uc124\uc815<br \/>\n            buf.append(\u201c[\u201d + record.getLevel().getName() + \u201c]\u201d);<br \/>\n            buf.append(\u201c:\u201d);<br \/>\n            buf.append(record.getMessage());<br \/>\n            buf.append(LINE_SEPA);<br \/>\n            return buf.toString();<br \/>\n        }<br \/>\n    }<br \/>\n    static class CustomConsoleHandler extends StreamHandler {<br \/>\n        public CustomConsoleHandler() {<br \/>\n            super();<br \/>\n            setOutputStream(System.out);<br \/>\n        }<br \/>\n        \/**<br \/>\n         * LogRecord\ub97c \ubc1c\ud589\ud569\ub2c8\ub2e4.<br \/>\n         * \ucd08\uae30 \uc0c1\ud0dc\uc5d0\uc11c\ub294, \ub85c\uae45\uc758 \uc694\uad6c\ub294 Logger \uc624\ube0c\uc81d\ud2b8\uc5d0<br \/>\n         * \uc5d0 \ub300\ud574 \ud589\ud574\uc838, \uc774 \uc624\ube0c\uc81d\ud2b8\ub294 LogRecord \ub97c \ucd08\uae30\ud654\ud574<br \/>\n         * \uc5ec\uae30\ub85c \uc804\uc1a1\ud588\uc2b5\ub2c8\ub2e4.<br \/>\n         *<br \/>\n         * @param record \ub85c\uadf8 \uc774\ubca4\ud2b8 \uc124\uba85. null \ub808\ucf54\ub4dc\ub294 \ub2e8\uc21c\ud788 \ubb34\uc2dc\ub429\ub2c8\ub2e4.<br \/>\n         * \uadf8\ub0e5 \uc54c\ub9bc\uc774 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\n         *\/<br \/>\n        public void publish (LogRecord record) {<br \/>\n            super.publish(record);<br \/>\n            flush();<br \/>\n        }<br \/>\n        \/**<br \/>\n         * StreamHandler.close\ub97c \uc7ac\uc815\uc758\ud558\uace0 \ud50c\ub7ec\uc2dc\ud558\uc9c0\ub9cc,<br \/>\n         * \ucd9c\ub825 \uc2a4\ud2b8\ub9bc\uc740 \ub2eb\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc989, System.err\uc740 \ub2eb\ud788\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<br \/>\n         *\/<br \/>\n        public void close() {<br \/>\n            flush();<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n<\/textarea><\/p>","protected":false},"excerpt":{"rendered":"<p>Java \ub85c\uadf8 \ud544\ud130\ub85c HTTP \uc694\uccad\uc744 \uad6c\ubb38 \ubd84\uc11d javax.servlet.Filter\ub97c \uad6c\ud604\ud558\uc5ec HTTP [...]<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":""},"categories":[19],"tags":[],"_links":{"self":[{"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/posts\/910"}],"collection":[{"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/comments?post=910"}],"version-history":[{"count":5,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/posts\/910\/revisions"}],"predecessor-version":[{"id":1894,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/posts\/910\/revisions\/1894"}],"wp:attachment":[{"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/media?parent=910"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/categories?post=910"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chat-messenger.com\/ko\/wp-json\/wp\/v2\/tags?post=910"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}