代码之家  ›  专栏  ›  技术社区  ›  Maxim Veksler

高效访问HttpServletRequest进行调试打印

  •  1
  • Maxim Veksler  · 技术社区  · 15 年前

    现在,一个请求可能会部分失败(例如,有几个匹配成功,但有一个匹配失败),在这种情况下,我想在失败的内部方法中捕获异常,打印错误+ServletUtil.toStringhtpServletRequest()并继续提供服务(降级但仍然有用,而完全请求失败)。

    将HttpServletRequest传递给在请求期间调用的每个可能失败的函数似乎有点难看,如果没有其他优雅的解决方案出现,我会这么做。

    创建一个before head ServletUtil.toStringhtpServletRequest()并将其存储在ThreadLocal映射中会浪费内存和CPU时间。出于某种原因,将HttpServletRequest对象存储在ThreadLocal中感觉不对(如果我错了,请更正)。

    调试信息被写入本地机器日志,并通过电子邮件直接发送给devs(伟大的工作log4j) TLSSMTPAppender ),所以登录到几个地方是不现实的(需要收集几封电子邮件来了解发生了什么),而ssh'ing到服务器是过时的:)(我们这里都是阴云密布的。。。在我查看错误时,服务器可能不存在)

    很明显,我在考虑生产中运行的服务器。

    评论?请告知。

    1 回复  |  直到 14 年前
        1
  •  0
  •   BalusC    15 年前

    在一个特定的时间内完成这项任务 Filter 之后 这个 FilterChain#doFilter() 打电话。这个 ServletRequest 对象已存在。在要优雅地抑制此异常的业务代码中,将异常存储为请求属性,并让 从请求中检查/获取它。


    :根据评论,下面是一个示例:

    public class Context { 
        private static ThreadLocal<Context> instance = new ThreadLocal<Context>();
        private HttpServletRequest request;
        private List<Exception> exceptions = new ArrayList<Exception>();
    
        private Context(HttpServletRequest request) {
            this.request = request;
            this.request.setAttribute("exceptions", exceptions);
        }
    
        public static Context getCurrentInstance() {
            return instance.get();
        }
    
        public static Context newInstance(HttpServletRequest request) {
            Context context = new Context(request);
            instance.set(context);
            return context;
        }
    
        public void release() {
            instance.remove();
        }
    
        public void addException(Exception exception) {
            exceptions.add(exception);
        }
    }
    

    下面是如何在控制器servlet中使用它:

    Context context = Context.newInstance(request);
    try {
        executeBusinessCode();
    } finally {
        context.release();
    }
    

    下面是如何在执行的业务代码中使用它:

    } catch (Exception e) {
        Context.getCurrentInstance().addException(e);
    }
    
    推荐文章