[英]Intercepting the end of the HTTP Session with Seam
我需要拦截用户针对Seam Web应用程序所做的每个请求的结尾。
过滤器似乎是在请求到达业务逻辑之前捕获请求的正确工具,而拦截器似乎对于单个类的建议很有用...
谢谢!
您的问题是关于Http Session not Request的拦截。 在这种情况下,您应该能够实现会话监听器。 在您的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);
}
}
那应该接近工作了,但是可能会有一些错别字。 这应该回答您有关观察会话上下文结束的问题。
沃尔特
使用FILTERS,您可以拦截请求和响应对象。 通过使用筛选器接口,您可以拦截请求对象。 void init(FilterConfig filterConfig)抛出ServletException
通过使用doFilter方法,无效doFilter(ServletRequest请求,ServletResponse响应,FilterChain链)引发IOException,ServletException
使用以上方法,您可以拦截请求对象。
主题标题与消息中的问题冲突。 您在标题中询问如何在会话结束时挂机,但在消息中您询问如何在请求结束时挂机。 这是两个完全不同的范围。 该会话从客户端发出的第一个请求开始,直到该客户端超时或被无效为止,该客户端没有为其创建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.
}
您可能希望FilterChain#doFilter()
立即自动退出方法块,就像许多初学者一样,例如HttpServletResponse#sendRedirect()
和consorts。 这是不正确的,除了异常/错误之外, return
语句和/或方法块的末尾才执行此操作。 这些方法只是用通常的Java方式调用的,没有什么特别的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.