これはSpring固有であるため、重複して参照される質問ではありません。それを追加した人は誰でも(事実から3年後!)、質問やコメントスレッドを読んで、本当の答えが何であるかを確認することはしませんでした。受け入れられた答えは完全な答えではありませんが、答えの作者は私が尋ねたように戻って編集することはありませんでした。
以下のRESTfulメソッドを考えると、Spring 3.1は「クライアントから送信されたリクエストが構文的に正しくありませんでした()」という400エラーを出します。パラメータにURLエンコードされたスラッシュ(%2F)が含まれている場合、token
たとえば「https://somewhere.com/ws/stuff/lookup/resourceId/287559/token/R4o6lI%2FbBx43/userName/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
役に立たなかったようです。