簡體   English   中英

在跨上下文請求轉發中找不到當前線程的會話

[英]No session Found for current thread in cross-context request forward

我有兩個在同一容器中運行的Web Servlet( Servlet-AServlet-B )。 Servlet-A是無法訪問數據庫的Web應用程序。 它具有一個過濾器,可將某些請求轉發到Servlet-B。 Servlet-B是一個Spring / Hibernate應用程序,可以訪問數據庫(使用Hibernate)。

當Servlet-A將請求轉發到Servlet-B的控制器時,后者無法為該請求創建Hibernate會話,這給我帶來了錯誤:

Caused by: org.hibernate.HibernateException: No Session found for current thread
12:04:29,802 ERROR [STDERR]     at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
12:04:29,803 ERROR [STDERR]     at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:990)

看起來轉發的請求的根上下文未被Servlet-B識別,因此無法授予它對其資源的訪問權限。

這是我在Servlet-A所做的工作(1)過濾器設置

   <filter>
        <filter-name>CandidateProxyFilter</filter-name>
        <filter-class>com.candidate.filter.CandidateProxyFilter</filter-class>                      
    </filter>
    <filter-mapping>
        <filter-name>CandidateProxyFilter</filter-name>
        <url-pattern>*.html</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

(2) Servlet-B過濾器代碼:

public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException,
                ServletException {
        final RequestDispatcher proxyDispatcher = createProxyDispatcher(request);
        proxyDispatcher.forward(request, response);
}

這里是Servlet-B上的相關控制器代碼:

@RequestMapping(method = RequestMethod.GET)
public String invokeView() {

    final Candidate candidate = candidateService.getCandidate(); // Crash !!!
...
}

CandidateService使用Hibernate會話訪問了數據庫,但是對於從Servlet-A轉發的請求,它將引發上述錯誤。 對於從Servlet-B上下文觸發的請求,這很好。 我只想了解發生了什么以及如何解決該問題?

我修好了它! 事實證明,默認情況下, Servlet-BOpenSessionInViewFilter的配置將忽略所有FORWARD請求類型:

 <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>

我要做的就是將以下內容添加到過濾器中:

<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>        

最終的設置是這樣的:

 <filter>
        <filter-name>hibernateFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hibernateFilter</filter-name>
        <url-pattern>*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>        
    </filter-mapping>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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