2011-05-03 8 views
5

Chcę, aby obiekt sesji nie był klasą serwletu, ale zwykłym z naszej aplikacji.pobierz HttpSession | Żądanie od prostej klasy java, a nie klasy serwletu

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(); 
} 

Odpowiedz

1

Nie sądzę, że to możliwe, aby przejść bezpośrednio do sesji i żądania obiektu. Możesz przekazać sesję i/lub obiekt żądania z serwletu do klasy Java w jakiejś metodzie lub w konstruktorze klasy Java.

7

Istnieje wiele sposobów, aby to zrobić, ale ... nie. Tylko twoja warstwa internetowa powinna mieć dostęp do sesji. Pozostałe warstwy powinny uzyskiwać parametry tylko z sesji, której potrzebuje. Na przykład:

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

opcje, które muszą uzyskać wniosek, a od niego - sesję w klasie non-serwletu, który jest nadal w warstwie internetowej:

  • sklepu żądanie w ThreadLocal w Filter (i wyczyść to później)
  • przekazać jako argument - albo w konstruktorze (jeśli obiekt jest tworzony w każdym żądaniu) lub jako argument metody.
+4

przekazania informacji zainteresowania (a więc nie sama sesja!) jest absolutnie najlepszym sposobem. – BalusC

+1

Ale jak ustawić rzeczy w sesji? – mjaggard

+0

@ mjaggard 'doSomeBusinessLogic' zwróci mapę do ponownego zapisania w sesji. –

15

nazywają to:

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

na filtr niestandardowy:

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() { 
    } 
} 

że będziesz zarejestrować go w pliku web.xml:

<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

Czy trzeba użyć chain.doFilter (żądanie, odpowiedź); dla dalszego procesu B'cause dostaję pusty ekran przeglądarki. –

+0

Przepraszam, moja wina (w pełni o tym zapomniałem), właśnie to poprawiłem :) –

+0

-1: nie Threadafe. Wątki są łączone przez kontener i nie zwalniasz poprawnie zmiennej threadlocal. – BalusC