2011-05-03 11 views
5

Voglio oggetto di sessione non in classe servlet ma ordinario da noi applicazione.ottenere HttpSession | Richiesta da semplice classe java non servlet classe

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

risposta

1

non credo che sia possibile, per accedere direttamente sessione e oggetto di richiesta. Quello che puoi fare è passare la sessione e/o richiedere l'oggetto da servlet a una classe Java in qualche metodo o in costruttore della classe Java.

7

Ci sono diversi modi per farlo, ma ... no. Solo il tuo livello web dovrebbe avere accesso alla sessione. Gli altri livelli dovrebbero solo ottenere i parametri dalla sessione di cui ha bisogno. Per esempio:

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

Le opzioni che avete per ottenere la richiesta, e da esso - la sessione in una classe non servlet, che è ancora nello strato web:

  • negozio la richiesta in un ThreadLocal in un Filter (e pulirlo in seguito)
  • passarlo come argomento - nel costruttore (se l'oggetto è istanziato su ogni richiesta) o come argomento del metodo.
+4

Passando le informazioni di interesse (e quindi non la sessione stessa!) è assolutamente il modo migliore. – BalusC

+1

Ma come si impostano le cose nella sessione? – mjaggard

+0

@ mjaggard 'doSomeBusinessLogic' restituirà la mappa da memorizzare in sessione. –

15

chiamano questo:

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

sul filtro personalizzato:

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

che ti registrarlo nel file 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

devo usare chain.doFilter (richiesta, risposta); per ulteriori processi B'cause ottengo lo schermo del browser vuoto. –

+0

scusa, colpa mia (l'ho completamente dimenticato), l'ho appena corretto :) –

+0

-1: non protetto da thread. I thread sono raggruppati dal contenitore e non stai rilasciando correttamente la variabile threadlocal. – BalusC

Problemi correlati