【问题标题】:How to override HttpServletRequest toString method?如何覆盖 HttpServletRequest toString 方法?
【发布时间】:2019-08-20 05:09:52
【问题描述】:

我正在使用基于Servlet 的Web 应用程序并希望获得适当的日志记录支持。我正在使用Log4j,当我收到任何请求时,我想用它的全部属性(不是所有内容,只是标题和参数)记录它。

例如:

@WebServlet(name = "Login", value = "/Login")
public class Login extends HttpServlet {
    final static Logger logger = Logger.getLogger(Login.class);

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        logger.info(req); // I want to log request with its 
        // properties: such as request parameters, headers and so on
        // TODO some logic here
    }
}

那么,我怎样才能以某种方式覆盖 HttpServletRequests toString() 方法,它实际上是一个接口。为它创建Wrapper 类并可以在那里覆盖toString() 方法是个好主意吗?

【问题讨论】:

  • 好吧,要覆盖 HttpServletRequest 的 toString() 方法,您需要扩展/实现它。为什么你甚至想要?
  • 你可能需要一个拦截器和一些已经完成的库
  • @ChrisNeve 我需要将请求参数记录到我的日志文件中以查看每个参数的详细信息。
  • @Eugene 你能给我举个例子吗?实际上,我没有在这个项目中使用 Spring。
  • @ChrisNeve 你能告诉我解决我的问题的最佳做法是什么吗?

标签: java web servlets java-8


【解决方案1】:

你可以像这样实现一个过滤器,你可以得到所有的请求头和参数 你可以登录到你的文件

@Component
public class HttpFilter implements Filter {
private static final Logger LOGGER = LogManager.getLogger(HttpLogging.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain 
chain)
        throws IOException, ServletException {
    // TODO Auto-generated method stub

    HttpServletRequest httpServletRequest  = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse  = (HttpServletResponse)response;
    LOGGER.info("logger before method aop FROM FILTER CLASS");
    LOGGER.info("content type " + httpServletRequest.getContentType());
    LOGGER.info("Local Name" + httpServletRequest.getLocalName());
      LOGGER.info("content type " + httpServletRequest.getContentType());
         LOGGER.info("request uri " +  httpServletRequest.getRequestURI());
         LOGGER.info("get Method " + httpServletRequest.getMethod());
         LOGGER.info("query string "  +httpServletRequest.getQueryString() );
         LOGGER.info("server name " + httpServletRequest.getServerName());
         LOGGER.info("server port "  + httpServletRequest.getServerPort());
         LOGGER.info("Parameter names  " + httpServletRequest.getParameter("empid"));


    System.out.println(request.getContentType());

    chain.doFilter(httpServletRequest, httpServletResponse);





  }

}

【讨论】:

  • 我确实认为这不是最佳实践。
  • 所以,问题是我怎样才能覆盖 toString() 方法一次,然后每当我尝试将它记录到我的文件中时都会调用此方法。
  • 这是最好的做法,在调用您的 Servlet 过滤器之前,您的每个请求都会被调用,并且在发送响应时它只会通过过滤器发送。
  • 那么,你的意思是,如果我需要以相同的样式记录所有请求,我需要重写 doFilter() 方法并复制/粘贴相同的流程?
  • 如果您的工作是记录每个请求,那么为什么需要覆盖 toString() 方法?它只是用来打印你当前的对象
【解决方案2】:

这是我过去使用过的。它使用 SLF4J,但语句应该与 Log4J 几乎相同。

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RequestLogger {

    public static void logRequestAttributes(Logger logger, HttpServletRequest request) {
        logger.debug("Attributes:");
        for (Enumeration<?> attributeNames = request.getAttributeNames(); attributeNames.hasMoreElements(); ) {
            String nextAttributeName = (String) attributeNames.nextElement();

            logger.debug("attribute \"" + nextAttributeName + "\" value is \"" + request.getAttribute(nextAttributeName) + "\"");
        }

        logger.debug("Parameters:");
        for (Enumeration<?> parameterNames = request.getParameterNames(); parameterNames.hasMoreElements(); ) {
            String nextParameterName = (String) parameterNames.nextElement();

            logger.debug("parameter \"" + nextParameterName + "\" value is \"" + request.getParameter(nextParameterName) + "\"");
        }

        logger.debug("Headers:");
        for (Enumeration<?> e = request.getHeaderNames(); e.hasMoreElements(); ) {
            String nextHeaderName = (String) e.nextElement();

            logger.debug("header name: \"" + nextHeaderName + "\" value is \"" + request.getHeader(nextHeaderName) + "\"");
        }

        String logStatement = "Server Name: " + request.getServerName() + "\n";
        logStatement += "\tServer Port: " + request.getServerPort() + "\n";
        logStatement += "\tServlet Path: " + request.getServletPath() + "\n";
        logStatement += "\tMethod: " + request.getMethod() + "\n";
        logStatement += "\tPath info: " + request.getPathInfo() + "\n";
        logStatement += "\tPath translated: " + request.getPathTranslated() + "\n";
        logStatement += "\tRequest URI: " + request.getRequestURI() + "\n";
        logStatement += "\tRequest URL: " + request.getRequestURL() + "\n";
        logStatement += "\tQuery String: " + request.getQueryString() + "\n";
        logStatement += "\tContext path: " + request.getContextPath() + "\n";

        logger.debug(logStatement);
    }
}

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多