Pregunta Spring 3 MVC accede a HttpRequest desde el controlador


Me gustaría manejar los atributos de solicitud y sesión yo mismo en lugar de dejarlo a la primavera @SessionAttributes, para el inicio de sesión de manejo de cookies, por ejemplo.

Simplemente no puedo entender cómo podría acceder al HttpRequest desde dentro de un controlador, necesito una manera de ir una capa por encima del @RequestAttribute y acceder al HttpRequest sí mismo. Con Stripes in solía hacer esto implementando un ApplicationContext y llamando getAttribute().

Además, pasando el HttpServletRequest como el parámetro parece no estar funcionando:

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

El método anterior no imprime nada.

¿Tienes algún consejo sobre esto?


74
2017-12-14 12:13


origen


Respuestas:


Spring MVC le proporcionará HttpRequest si lo agrega a la firma de su método de control:

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 ve, simplemente agregando el HttpServletRequest y HttpServletResponse los objetos a la firma hacen que Spring MVC pase esos objetos a su método de controlador. Querrás el HttpSession objeto también

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 a la lista de argumentos admitidos que Spring MVC puede inyectarse de manera automática en sus métodos de manejo.


147
2017-12-14 12:19



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

También puedes usar esto en tu clase:

@Autowired
private HttpServletRequest context;

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


57
2018-04-10 23:58