[英]No session Found for current thread in cross-context request forward
我有兩個在同一容器中運行的Web Servlet( Servlet-A
和Servlet-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-B
中OpenSessionInViewFilter
的配置將忽略所有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.