【问题标题】:How to log Character decoding error in Tomcat servlet如何在 Tomcat servlet 中记录字符解码错误
【发布时间】:2015-11-09 21:40:15
【问题描述】:

在我的 Servlet 中,我收到一个带有参数的 GET 请求。然后我尝试解码参数并记录可能的编码错误:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String json = req.getParameter("json");

    try{
        String jsonDecoded = java.net.URLDecoder.decode(json, "UTF-8");
    } catch(UnsupportedEncodingException | IllegalArgumentException e){
        // log error somewhere
    }
}

问题是,代码的 try/catch 部分没有用,因为参数已经从 getParameter 函数处理,到达第 5 行的字符串已经解码。如果我使用无效参数调用 servlet,则会在 catalina.out 中记录错误,并且该变量具有空值:

Aug 17, 2015 11:22:07 AM org.apache.tomcat.util.http.Parameters processParameters
INFO: Character decoding failed. Parameter [json] with value [...] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values.
 Note: further occurrences of Parameter errors will be logged at DEBUG level.

我想要的是将错误记录到我自己的日志中(例如,使用 log4j 处理它)。是否可以将该行日志从 catalina.out 重定向到我自己的记录器(请注意,我不想从 catalina.out 文件中记录所有日志)?作为替代方案,是否可以从 HttpServletRequest 中获取未处理的参数,然后按照我的喜好进行处理?

【问题讨论】:

    标签: java tomcat servlets logging


    【解决方案1】:

    您应该使用getQueryString 方法,因为您想自己解码值。它返回 -

    一个包含查询字符串的字符串,如果 URL 不包含查询字符串,则为 null。该值不被容器解码。

    像下面这样的事情应该这样做

    String queryStr = URLDecoder.decode(request.getQueryString(), "UTF-8");
    

    【讨论】:

    • 是的,谢谢,我得到了同样的结论。谢谢!!
    猜你喜欢
    • 2019-05-13
    • 2011-03-10
    • 2012-06-14
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2011-02-04
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多