web-dev-qa-db-fra.com

Comment puis-je obtenir un HttpServletRequest dans mes beans de printemps?

Je développe une application avec un frontal basé sur Flex et un back-end Spring/Hibernate.

Pour que l'intégration Facebook fonctionne de la façon dont je l'ai actuellement, je dois lire les cookies définis en javascript sur le front-end sur le back-end et faire une validation lors de la connexion pour voir si l'utilisateur tente d'usurper son Facebook s'identifier.

Ce serait assez facile, mais je ne peux pas comprendre comment obtenir le HttpServletRequest. J'utilise une configuration Spring assez basique (c'est ma première vraie application Spring, et je la connais bien maintenant, mais il y en a beaucoup que je n'ai jamais examinée.)

Je n'utilise pas Spring MVC ou Spring WebFlow ou quelque chose comme ça. Je peux obtenir le ServletContext, mais je n'ai pas encore compris comment obtenir la demande.

De l'aide?

34
Jason Maskell

Si FlexContext n'est pas disponible:

Solution 1: méthode interne (> = Spring 2.0 requis)

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

Solution 2: à l'intérieur du bean (pris en charge par> = 2.5, Spring 3.0 pour les beans singelton requis!)

@Autowired
private HttpServletRequest request;
106
Gerrit Brehmer

C'est un peu spécifique à Flex/BlazeDS, mais voici la solution que j'ai trouvée. Désolé si répondre à ma propre question est un faux pas.

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

Cela fonctionne, je reçois les cookies. Mon problème se tournait vers Spring - BlazeDS l'avait. Le printemps aussi, probablement, mais je ne sais toujours pas comment y accéder.

11
Jason Maskell

@ eeezyy n'a pas fonctionné pour moi, bien que j'utilise Spring Boot (2.0.4) et cela peut différer, mais une variation ici en 2018 fonctionne ainsi:

@Autowired
private HttpServletRequest request;
2
chrismacp

Le @Context annotation (voir les réponses à cette question: Que fait l'annotation de contexte au printemps? ) provoquera son injection pour vous.

Je devais utiliser

@Context
private HttpServletRequest request;
2
eeezyy

cela devrait le faire

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