Slash encodé (%2F) avec le chemin de RequestMapping Spring param donne HTTP 400

il ne s'agit pas d'un duplicata question référencée , parce qu'elle est spécifique au ressort. Celui qui a ajouté cela (3 ans après le fait!) n'a pas pris la peine de lire la question ou le fil de commentaires pour voir quelle était la vraie réponse. La réponse acceptée n'est pas tout à fait la réponse, mais l'auteur de la réponse n'est jamais revenu et l'a modifié comme je l'ai demandé.

étant donné la méthode restful ci-dessous, le ressort 3.1 donne une erreur de 400 avec " la requête envoyé par le client était syntaxiquement incorrect ()."lorsque le paramètre token contient une barre oblique encodée par une URL (%2F), par exemple " https://somewhere.com/ws/stuff/lookup/resourceId/287559/token/R4o6lI%2FbBx43/userName/jim " sans le %2F tout fonctionne très bien. Un tiers appelle déjà ce service (bien sûr! Je ne peux donc pas changer ce qu'ils envoient, du moins à court terme. Vous avez des idées pour contourner ce problème du côté serveur?

Ce problème est très bien décrit ici https://jira.springsource.org/browse/SPR-8662 bien que cette question soit liée à UriTemplate que je n'utilise pas que je peux dire.

@RequestMapping("/ws/stuff/**")
@Controller
public class StuffController {
  @RequestMapping(value = "/ws/stuff/lookup/resourceId/{resourceId}/token/{token}/userName/{userName}", method = RequestMethod.GET)
   public @ResponseBody
   String provisionResource(@PathVariable("resourceId") String resourceId, @PathVariable("token") String token, @PathVariable("userName") String userName, ModelMap modelMap,
         HttpServletRequest request, HttpServletResponse response) {
      return handle(resourceId, userName, request, token, modelMap);
   }
}

Note: c'est sur Glassfish 3.1.2, et au début C'était Grizzly / Glassfish n'acceptant pas la barre oblique, mais

-Dcom.sun.grizzly.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

a corrigé ça.

asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.http.encoded-slash-enabled=true

n'a pas semblent aider.

27
demandé sur Community 2012-11-21 00:58:56

6 réponses

Ce pourrait être votre réponse: urlencoded barre oblique est la rupture de l'URL

je suggère de ne pas mettre cela dans le chemin, déplacez-le à une requête param à la place.

Travail autour de:

vous pouvez changer le RequestMapping en

@RequestMapping(value = "/ws/stuff/lookup/resourceId/**", method = RequestMethod.GET) 

et ensuite analyser les variables path manuellement à partir de l'objet request.

8
répondu Solubris 2018-02-13 13:36:22

pour la botte à ressort, le suivant a fait le tour

@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) throws Exception {
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }

}
12
répondu iamiddy 2016-06-02 20:03:20

voici un correctif pour le ressort 3.2.4 (devrait fonctionner pour d'autres versions également). On doit écraser L'UrlPathHelper par défaut

public class UrlPathHelperFixed extends UrlPathHelper {

    public UrlPathHelperFixed() {
        super.setUrlDecode(false);
    }

    @Override
    public void setUrlDecode(boolean urlDecode) {
        if (urlDecode) {
            throw new IllegalArgumentException("Handler [" + UrlPathHelperFixed.class.getName() + "] does not support URL decoding.");
        }
    }

    @Override
    public String getServletPath(HttpServletRequest request) {
        String servletPath = getOriginatingServletPath(request);
        return servletPath;
    }

    @Override
    public String getOriginatingServletPath(HttpServletRequest request) {
        String servletPath = request.getRequestURI().substring(request.getContextPath().length());
        return servletPath;
    }
}

et l'injecter au gestionnaire de cartographie:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="order" value="-1"></property>
    <property name="urlPathHelper">
        <bean class="com.yoochoose.frontend.spring.UrlPathHelperFixed"/>
    </property>
</bean>

Après une dure journée de travaille, il travaille maintenant pour moi :-)

il a été suggéré à L'équipe de printemps comme https://jira.springsource.org/browse/SPR-11101

6
répondu 30thh 2013-11-20 11:07:17

pour l'application de la botte à ressort cela a fonctionné pour moi..

Version 1 Ajouter

org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

à votre application .propriétés fichier

Version 2 lancez votre application de démarrage à ressort comme ceci.

static void main(String[] args) {
    System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
    SpringApplication.run this, args
}

Version 3 ou exécutez votre application java avec - Dorg.Apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

cette variable fixe % 2F pour moi.

4
répondu manukyanv07 2016-02-25 19:12:40

j'ai trouvé cette solution qui fonctionne pour moi;

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");

juste avant springApplication.run (args);

et Ajouter ci-dessous le code de la classe d'Application

 @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(false);
        configurer.setUrlPathHelper(urlPathHelper);
    }
3
répondu Ankur Gupta 2016-06-07 11:23:47

nous venons de rencontrer ce problème à mon bureau, nous avons fait ce qui a été suggéré ci-dessus à partir de ce que Solubris dit où vous l'avez mis dans un param de requête. La seule exigence est que les données pourraient avoir un '&', qui serait gâcher la requête param. Tout ce que nous avons eu à faire est d'encoder le texte avant qu'il ne soit envoyé dans L'URL et même '&' ont été filtrés.

0
répondu rsteier 2014-04-10 19:57:59