簡體   English   中英

用Seam攔截HTTP會話的結束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM