【问题标题】:Is there a way to check if I'm inside a servlet request with Guice?有没有办法检查我是否在 Guice 的 servlet 请求中?
【发布时间】:2013-06-25 16:52:19
【问题描述】:

我正在编写一个 JUL 日志记录 Handler,如果我们当前正在处理一个请求,我想用有关当前请求的信息来扩充记录的消息。为此,我将Provider<Thing> 注入Handler,其中Thing@RequestScoped

但是,如果在我们未处理请求时发生日志记录,则调用 provider.get() 会引发 OutOfScopeException。我觉得抓住OutOfScopeException 会很糟糕。是否有更好的方法来确定请求当前是否正在执行?

【问题讨论】:

    标签: java servlets guice guice-servlet


    【解决方案1】:

    对于检票口,我使用了一个小技巧。这应该是独立于框架的。我做了一个请求过滤器并在其中放置了一个公共静态 ThreadLocal。因此,如果当前线程是从请求中产生的,则将设置 threadlocal。

    public class SessionContext implements Filter {
    
        private static final ThreadLocal<HttpSession> session = new ThreadLocal<HttpSession>();
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            return;
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            session.set(((HttpServletRequest)servletRequest).getSession());
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
            return;
        }
    
        public static HttpSession getSession(){
            return session.get();
        }
    
        public static User getUser(){
            return (User) session.get().getAttribute(UserService.USER);
        }
    }
    

    在 web.xml 中:

    <filter>
        <filter-name>session</filter-name>
        <filter-class>SessionContext</filter-class>
    </filter>
    

    【讨论】:

    【解决方案2】:

    据我所知,没有优雅的方法可以做到这一点。 Guice API 很严格,不会授予对进行此类测试所需的线程本地的访问权限。从版本 3 开始,有问题的线程本地位于 com.google.inject.servlet.GuiceFilter#localContext。您可以通过反射访问它,但可以说它比捕获异常更糟糕。

    我会坚持缓存异常...或侵入该类并添加静态布尔测试方法。

    【讨论】:

    • 是的,我查看了 GuiceFilter 和 ServletScopes 中的代码,并认为我不能使用它们进行检查。没有内置的 Guice 方法来检查调用者是否在范围内?如果没有,我想我会制作自己的 ThreadLocal。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多