¿Cómo obtengo un HttpServletRequest en mis frijoles de primavera?

3 minutos de lectura

Estoy desarrollando una aplicación con un front-end basado en Flex y un back-end Spring/Hibernate.

Para que la integración de Facebook funcione de la forma en que lo tengo actualmente, necesito leer las cookies configuradas en javascript en el front-end en el back-end y hacer alguna validación durante el inicio de sesión para ver si el usuario está intentando falsificar su Facebook. acceso.

Esto sería bastante fácil, pero no puedo averiguar cómo obtener HttpServletRequest. Estoy usando una configuración Spring bastante básica (esta es mi primera aplicación Spring real, y ahora estoy bastante familiarizado con ella, pero hay muchas cosas que nunca he visto).

No estoy usando Spring MVC o Spring WebFlow ni nada por el estilo. Puedo obtener el ServletContext, pero aún no he descubierto cómo obtener la solicitud.

¿Alguna ayuda?

avatar de usuario
Gerrit Brehmer

Si FlexContext no está disponible:

Solución 1: método interno (> = Spring 2.0 requerido)

HttpServletRequest request = 
        ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())
                .getRequest();

Solución 2: frijol interno (compatible con >= 2.5, ¡se requiere Spring 3.0 para frijoles singelton!)

@Autowired
private HttpServletRequest request;

  • También puede usar la anotación @Resource en lugar de Autowired. Entonces, no necesita requerir el cableado automático explícitamente, y está un poco menos vinculado a Spring.

    – pstobiecki

    11 de febrero de 2016 a las 8:04

  • Autowired tiene boolean required() default true;

    – Ghandhikus

    18 de marzo de 2017 a las 11:27

  • Una edición sugiere eliminar la información, que para los frijoles singelton se requiere Spring> = 3. Hay un error/característica faltante en Spring 2.5, que la inyección de beans con ámbito de solicitud en beans singelton no funciona correctamente

    –Gerrit Brehmer

    1 de noviembre de 2018 a las 21:21

  • Obtención de error: ‘No se encontró ninguna solicitud vinculada a un subproceso: ¿Se refiere a atributos de solicitud fuera de una solicitud web real o está procesando una solicitud fuera del subproceso de recepción original? En este caso, use RequestContextListener o RequestContextFilter para exponer la solicitud actual

    – Bhargav Patel

    30 de noviembre de 2018 a las 15:46

Esto es algo específico de Flex/BlazeDS, pero esta es la solución que se me ocurrió. Lo siento si responder a mi propia pregunta es un paso en falso.

    HttpServletRequest request = flex.messaging.FlexContext.getHttpRequest();

    Cookie[] cookies = request.getCookies();

    for (Cookie c:cookies)
    {
        log.debug(String.format("Cookie: %s, %s, domain: %s",c.getName(), c.getValue(),c.getDomain()));
    }

Funciona, consigo las galletas. Mi problema era mirar a Spring: BlazeDS lo tenía. Probablemente la primavera también lo haga, pero todavía no sé cómo llegar a ella.

La respuesta de @eeezyy no funcionó para mí, aunque estoy usando Spring Boot (2.0.4) y puede diferir, pero una variación aquí en 2018 funciona así:

@Autowired
private HttpServletRequest request;

  • Tirará fatal: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.

    – Ahmad Asjad

    9 de marzo a las 16:23

esto debería hacerlo

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getRequestURI();

avatar de usuario
eeezyy

los @Context anotación (vea las respuestas en esta pregunta: ¿Qué hace la anotación de contexto en Spring?) hará que se inyecte por usted.

tuve que usar

@Context
private HttpServletRequest request;

avatar de usuario
mateusz niedbal

La mejor manera es autoconectar con un constructor:

private final HttpServletRequest httpServletRequest;

public ClassConstructor(HttpServletRequest httpServletRequest){
      this.httpServletRequest = httpServletRequest;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad