2 votes

SpringBoot Problème de variable de chemin avec barre oblique

J'ai un problème avec les slashs dans les variables qui devraient être envoyées dans l'url. Par exemple, l'id pourrait être comme ceci :

ID: /gfdge1/DkxA8P+jYw43
URL: localhost:8080/find-user//gfdge1/DkxA8P+jYw43

"error": "Internal Server Error",
    "exception": "org.springframework.security.web.firewall.RequestRejectedException",
    "message": "The request was rejected because the URL was not normalized.",

à cause de cette barre oblique en première position, cela pose un problème

Avant cela, j'avais des problèmes avec ces barres obliques au milieu de l'ID, mais j'ai résolu ce problème avec ce code :

   @RequestMapping(name = "Get user data by ID", value = "/find-user/{userId}/**", method = RequestMethod.GET)
    @ResponseBody
    public User getUserData(@PathVariable String userId, HttpServletRequest request) {
        final String path =
                request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
        final String bestMatchingPattern =
                request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();

        String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);

        String id="";
        if (null != arguments && !arguments.isEmpty()) {
            id = userId + '/' + arguments;
        } else {
            id = userId;
        }
        return userService.getUserData(id);
    }

mais cela ne fonctionne pas dans le cas présent où la barre oblique est en première position. J'ai également essayé d'utiliser RequestParam au lieu de PathVariable, mais cela pose des problèmes avec certains caractères spéciaux, par exemple lorsque j'utilise RequestParam, il remplace '+' par un espace vide,...

Quelqu'un peut-il m'aider à résoudre ce problème ?

3voto

Plog Points 5142

C'est un problème inhérent à l'utilisation de chaînes de caractères comme variables de chemin, ce n'est pas un problème avec votre code mais avec la façon dont la requête HTTP est interprétée, vous ne pouvez donc rien faire dans votre code pour que cela fonctionne.

Vous avez cependant quelques options :

  1. Assurez-vous que les valeurs que vous utilisez ne peuvent pas être créées avec des caractères spéciaux tels que "/"
  2. Évitez complètement d'utiliser des chaînes de caractères dans les variables de chemin d'accès.

Je penche plutôt pour le point 2, car maintenir le point 1 pour tous les caractères/chaînes problématiques possibles est assez désordonné et inutile.

Pour faire 2 correctement, vous devriez envisager d'avoir tous vos getters REST qui trouvent leurs entités liées par un ID numérique seulement, par ex.

localhost:8080/find-user/3

Si vous avez besoin d'ajouter des paramètres de recherche supplémentaires, par exemple le nom d'utilisateur dans votre cas, vous devez utiliser quelque chose comme QueryDSL pour créer un prédicat de paramètres de recherche qui sont transmis en tant que paramètres de requête au lieu de variables de chemin d'accès, par exemple :

localhost:8080/find-user?username=/gfdge1/DkxA8P+jYw43

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X