如何在Tomcat servlet中记录字符解码错误

时间:2015-08-17 09:42:39

标签: java tomcat servlets logging

在我的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文件中记录ALL)?作为替代方案,是否可以从HttpServletRequest获取未处理的参数,然后按我喜欢的方式处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

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

  

包含查询字符串的String;如果URL不包含查询字符串,则返回null。该值不会被容器解码。

下面的内容应该这样做

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