Spring RequestMapping パスパラメータでエンコードされたスラッシュ (%2F) により HTTP 400 が返される 質問する

Spring RequestMapping パスパラメータでエンコードされたスラッシュ (%2F) により HTTP 400 が返される 質問する

これは重複ではありません参照された質問、これは Spring 固有のものだからです。これを追加した人は (事実から 3 年後!)、質問やコメント スレッドを読んで本当の答えが何であるかを確認する手間を惜しんでいました。受け入れられた回答は完全な答えではありませんが、回答の作成者は戻ってきて、私が尋ねたように編集しませんでした。

以下の RESTful メソッドでは、パラメータにtokenURL エンコードされたスラッシュ (%2F) が含まれている場合、Spring 3.1 は「クライアントから送信されたリクエストの構文が正しくありません ()」という 400 エラーを返します。たとえば、「https://somewhere.com/ws/stuff/lookup/resourceId/287559/token/R4o6lI%2FbBx43/ユーザー名/jim" %2F がなければ、すべて正常に動作します。サードパーティがすでにこのサービスを呼び出しているため (当然ですが)、少なくとも短期的には、送信される内容を変更することはできません。サーバー側でこれを回避する方法について何かアイデアはありますか?

この問題はここで非常によく説明されているhttps://jira.springsource.org/browse/SPR-8662ただし、この問題は私が使用していない UriTemplate に関連していることがわかります。

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

注: これはGlassfish 3.1.2上でのもので、最初はGrizzly/Glassfishがスラッシュを受け入れませんでしたが、

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

それを修正しました。

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

役に立たなかったようです。

ベストアンサー1

spring-bootの場合、次の方法でうまくいきました

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

}

おすすめ記事