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

使用Seam截取HTTP会话的结尾

  •  0
  • raoulsson  · 技术社区  · 15 年前

    我需要截取用户对SeamWeb应用所做的每个请求的结尾。

    虽然过滤器似乎是在请求到达您的业务逻辑之前捕获请求的正确工具,但是拦截器似乎对单个类很有用…

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  1
  •   giri    15 年前

    使用过滤器,您可以截获请求和响应对象。通过使用过滤器接口,您可以截获请求对象。 void init(filterconfig filterconfig) 抛出servletexception

    通过使用Dofilter方法void Dofilter(servletRequest请求, 伺服响应响应, 过滤链) 引发IOException, 服务例外

    使用上述方法,您可以截获请求对象。

        2
  •  2
  •   Walter White    15 年前

    您的问题是关于截取HTTP会话结束而不是请求。如果是这样,您应该能够实现会话侦听器。在web.xml中声明。您必须使用静态方法来获取组件引用,因为这不是Seam组件。

    否则,您可能希望实现一个只观察会话上下文结束的组件。它可以是事件或应用程序范围的组件。

    @Scope(ScopeType.EVENT)
    @Name("com.yourdomain.observer.sessionObserver")
    public class SessionObserver
    {
    
    @In
    private EntityManager entityManager;
    
    // automatically create this component when the session is destroyed (actually just before it is)
    @Observer("org.jboss.seam.context.preContextDestroy.SESSION", create = true)
    @Transactional
    public void onSessionDestroyed()
    {
      entityManager.persist(httpSession);
    }
    }
    

    这应该是接近工作,但可能有一些打字错误。这应该回答关于观察会议结束情况的问题。

    沃尔特

        3
  •  0
  •   BalusC    15 年前

    主题标题与邮件中的问题冲突。你在书名里问如何钩住 阶段 但是在信息里你在问如何钩住 请求 . 这是两个完全不同的范围。会话从客户提出的第一个请求开始,而客户没有 HttpSession 对象在超时或失效之前一直被创建。从客户端的第一次单击/书签/地址栏调用开始,请求一直存在,直到相关的响应被完全提交和发送为止。

    假设你的意思是 请求 因为你已经在谈论过滤器的好处来钩住一些代码 之前 请求已被处理。你可能没有意识到你可以使用相同的 Filter 钩住一些代码 之后 请求已被处理。你所要做的就是输入适当的代码 之后 这个 FilterChain#doFilter() .

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        // You can do here stuff BEFORE the request is been processed further.
    
        chain.doFilter(request, response);
    
        // You can do here stuff AFTER the request is been processed.
    }
    

    你可能以为 过滤链dofilter()) 有点像许多初学者所期望的那样,立即自动退出方法块 HttpServletResponse#sendRedirect() 和配偶。这是不真实的,这是 return 声明和/或只是 结束 除了异常/错误之外,还有一个方法块。这些方法只是用通常的Java方式调用,没有什么特别之处。