2011-12-14 34 views
66

Me gustaría manejar los atributos de solicitud y sesión yo mismo en lugar de dejarlo en la primavera @SessionAttributes, para el inicio de sesión de manejo de cookies, por ejemplo.Spring 3 MVC que accede a HttpRequest desde el controlador

No puedo entender cómo podría acceder al HttpRequest desde un controlador, necesito una forma de ir a una capa por encima del @RequestAttribute y acceder al HttpRequest. Con Stripes in se utiliza para hacer esto implementando un ApplicationContext y llamando al getAttribute().

También, pasando el HttpServletRequest como parámetro no parece estar funcionando:

@RequestMapping(value="/") public String home(HttpServletRequest request){ 
    System.out.println(""+request.getSession().getCreationTime()); 
    return "home"; 
} 

El método anterior no se imprime nada.

¿Tiene algún consejo al respecto?

Respuesta

133

Spring MVC le dará la HttpRequest si sólo añade a su controlador de método de firma:

Por ejemplo:

/** 
* Generate a PDF report... 
*/ 
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET) 
public @ResponseBody void generateReport(
     @PathVariable("objectId") Long objectId, 
     HttpServletRequest request, 
     HttpServletResponse response) { 

    // ... 
    // Here you can use the request and response objects like: 
    // response.setContentType("application/pdf"); 
    // response.getOutputStream().write(...); 

} 

Como se ve, simplemente añadiendo los HttpServletRequest y HttpServletResponse objetos a la firma hace que Spring MVC pase esos objetos a su método de controlador. También querrá el objeto HttpSession.

EDITAR: Parece que HttpServletRequest/Response no funciona para algunas personas en Spring 3. Intente utilizar los objetos Spring WebRequest/WebResponse como señaló Eduardo Zola.

Recomiendo encarecidamente que eche un vistazo al list of supported arguments que Spring MVC puede inyectar de manera automática a los métodos de su manejador.

+0

Hola, thx por los consejos, no sé lo que estoy haciendo mal, pero esto no está funcionando: no hace nada impresiones: \t @RequestMapping (value = "/") \t public String casa (petición HttpServletRequest) { \t \t \t System.out.println ("" + request.getSession(). GetCreationTime()); \t \t \t \t return "home"; \t \t \t} Esto debería indicar la cantidad actual pof millis pero no es así, también anotar el método con @RequestBody no cambia nada, ¿algún otro consejo? THX para esto – JBoy

+1

I segundo JBoy también, no funciona –

+1

¡Gracias @jjmontes por el enlace a los argumentos admitidos de Spring MVC! – Barett

53

Sé que es una pregunta antigua, pero ...

También puede utilizar esto en su clase:

@Autowired 
private HttpServletRequest context; 

Y esto proporcionará la instancia actual de HttpServletRequest para la que utiliza en su método.

+3

¿No lo hace de esta manera para evitar que el control bean sea un singleton? – jjmontes

+1

Los controladores de resorte siempre son simples. –

+7

Esto parece incorrecto. ¿Qué sucede si el controlador está manejando más de una solicitud en el momento dado? ¿Qué es la solicitud "actual" entonces? – sbk

Cuestiones relacionadas