2011-05-03 11 views
5

Quiero sesión El objeto no está en la clase de servlet sino que es común desde la aplicación.obtener HttpSession | Solicitud de la clase java simple no clase servlet

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

Respuesta

1

no creo que es posible, para acceder directamente a la sesión y peticiones de objetos. Lo que puede hacer es pasar la sesión y/o solicitar el objeto desde el servlet a una clase Java, ya sea en algún método o en el constructor de la clase Java.

7

Existen varias formas de hacerlo, pero ... no. Solo su capa web debe tener acceso a la sesión. Las otras capas solo deberían obtener los parámetros de la sesión que necesita. Por ejemplo:

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

Las opciones que tiene para obtener la solicitud, y de ella - la sesión en una clase no servlet, que todavía está en la capa de tela:

  • tienda de la solicitud en un ThreadLocal en un Filter (y luego límpialo)
  • pásalo como argumento - en el constructor (si el objeto está instanciado en cada solicitud) o como un argumento de método.
+4

pasar la información de interés (¡y por lo tanto no la sesión en sí!) es absolutamente la mejor manera. – BalusC

+1

Pero, ¿cómo se configuran las cosas en la sesión? – mjaggard

+0

@ mjaggard 'doSomeBusinessLogic' devolverá el mapa para almacenar nuevamente en sesión. –

15

llaman a esto:

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

en su filtro personalizado:

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

que quedará registrado en el archivo 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

tengo que usar chain.doFilter (solicitud, respuesta); para un proceso posterior Porque me aparece la pantalla del navegador en blanco. –

+0

lo siento, mi culpa (lo olvidé por completo), lo acabo de corregir :) –

+0

-1: no es seguro. Los subprocesos se agrupan en el contenedor y no está liberando correctamente la variable local de thread. – BalusC

Cuestiones relacionadas