2011-05-03 23 views
5

oturumunu istiyorum Nesne sınıfında değil, uygulamadan sıradan.HttpSession | Basit java sınıfı istekleri sunucu sınıfı değil

web.xml

<listener> 
     <listener-class>com.abc.web.ApplicationManager</listener-class> 
</listener> 
<listener> 
     <listener-class>com.abc.web.SessionManager</listener-class> 
</listener> 

ViewPrices.java

public class ViewPrices implements Cloneable, Serializable { 

Session session = request.getSession(); 
        servletContext.getSession() 
        anyWay.getSession(); 
} 

cevap

1

Ben, bu mümkün olduğunu sanmıyorum doğrudan oturum ve istek nesneye erişim. Yapabilecekleriniz, oturumu ve/veya nesneyi sunucudan bir Java sınıfına ya bazı yöntemlerde veya Java sınıfının yapıcısında iletmektir.

7

Bunu yapmanın birçok yolu vardır, ancak .. yapma. Sadece web katmanınız oturuma erişebilmelidir. Diğer katmanlar yalnızca parametreleri ihtiyaç duyduğu oturumdan almalıdır. Örneğin: -:

  • mağaza isteği

    service.doSomeBusinessLogic(
        session.getAttribute("currentUser"), 
        session.getAttribute("foo")); 
    

    İsteği elde etmek zorunda ve ondan seçenekleri olmayan bir servlet sınıfında oturumu, söz konusu web katmanında hala içinde bir Filter (ve sonra temizleyin)

  • bunu argüman olarak iletin - yapıcıda (nesne her istekte örneklenmişse) veya yöntem argümanı olarak.
+4

bilgiler aktarılırken: Eğer web.xml dosyasına kayıt edeceğiz

public class RequestFilter implements Filter { private static ThreadLocal<HttpServletRequest> localRequest = new ThreadLocal<HttpServletRequest>(); public static HttpServletRequest getRequest() { return localRequest.get(); } public static HttpSession getSession() { HttpServletRequest request = localRequest.get(); return (request != null) ? request.getSession() : null; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (servletRequest instanceof HttpServletRequest) { localRequest.set((HttpServletRequest) servletRequest); } try { filterChain.doFilter(servletRequest, servletResponse); } finally { localRequest.remove(); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } 

ilgi (ve böylece oturumun kendisi değil!) kesinlikle en iyi yoldur. – BalusC

+1

Ancak, seansa nasıl bir şey koyarsınız? – mjaggard

+0

@ mjaggard 'doSomeBusinessLogic', oturumu tekrar depolamak için haritayı döndürür. –

15

çağrı bu: Özel filtresinde

RequestFilter.getSession(); 
RequestFilter.getRequest(); 

:

<filter> 
    <filter-name>RequestFilter</filter-name> 
    <filter-class>your.package.RequestFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>RequestFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

chain.doFilter kullanmak zorundayım (istek, yanıt); Daha fazla işlem için B'cause boş tarayıcı ekranı olsun. –

+0

üzgünüm, benim hatam (bunu tamamen unuttum), sadece düzeltdim :) –

+0

-1: threadafe. Dişler kapsayıcı tarafından toplanır ve threadlocal değişkenini düzgün şekilde serbest bırakmazsınız. – BalusC