代码之家  ›  专栏  ›  技术社区  ›  Trick

从请求读取时防止IllegalStateException

  •  2
  • Trick  · 技术社区  · 16 年前

    我有一个拦截器,用于捕获异常并发送此异常的电子邮件。

    在邮件服务类中,我有:

    CoreController cc = (CoreController)invocation.getAction();
    HttpServletRequest request = cc.getRequest();
    

    我想在电子邮件中插入请求正文(如果存在)。像这样:

    StringWriter msg = new StringWriter();
    msg.write("Requested URI: " + request.getRequestURI()+NEW_LINE);
    msg.write("Requested Query String: " + request.getQueryString()+NEW_LINE);
    msg.write("Request method: "+request.getMethod()+NEW_LINE);
    try {
     if (request.getReader() != null) {
      msg.write("Request body: "+ request.getReader().readLine()+NEW_LINE);
      request.getReader().close();
     }
    } catch (IOException e) {
        e.printStrackTrace();
    } catch(IllegalStateException e) {
        e.printStrackTrace();
    }
    

    现在,当reader不为null时,它总是抛出一个非法状态异常。如何“还原”读卡器,或者如何以其他方式读取请求正文?

    异常:已为此请求调用getInputStream()

    3 回复  |  直到 14 年前
        1
  •  3
  •   Adam Paynter    16 年前

    也许您应该尝试使用请求的 InputStream 而不是它的 Reader 如果您收到 IllegalStateException :

    BufferedReader bufferedReader;
    try {
        bufferedReader = request.getReader();
    } catch (IllegalStateException e) {
        InputStream inputStream = request.getInputStream();
    
        // As per BalusC's comment:
        String charsetName = request.getCharacterEncoding();
        if (charsetName == null) {
            charsetName = "UTF-8";
        }
    
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, charsetName);
        bufferedReader = new BufferedReader(inputStreamReader);
    }
    
    bufferedReader.readLine();
    
        2
  •  1
  •   Aaron Digulla    16 年前

    我猜这是在解析请求的代码中发生的。所以在这个阶段,您不能再读取请求主体了。相反,您应该检查包含异常的字段。struts配置必须包含以下代码:

    <exception
      key="exception"
      path="/UserExists.jsp"
      type="java.lang.Exception"/>
    

    这意味着您可以在请求属性中找到异常 exception .

        3
  •  0
  •   sfussenegger    16 年前

    注意:包装HttpServletRequest和HttpServletResponse并不少见(参见示例) Jetty's GzipFilter ,尤其是它的GZIPResponseWrapper类)。但是,在更改请求对象(行为)时,您应该谨慎地执行此操作 可以 影响其他筛选器或servlet。