一つの方法は、HTTPリクエストを作成する前spring-mvc
迎撃
を使用されるだろう、あなたはスラッシュでそれを送ることができますし、要求が正しいハンドラによって処理されるURLEncoder
その方法を使用してfile_name
パス変数を符号化します。次に、コントローラメソッドの前にメソッドが呼び出されるインターセプタを作成する必要があります。インターセプタでは、パス変数をURLDecoder
でデコードし、属性として戻します。属性名はHandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE
定数で指定され、すべてのパス変数のマップが含まれています。
インターフェイスのすべてのメソッドを実装しない場合は、インターセプタはHandlerInterceptor
インターフェイスを実装するか、HandlerInterceptorAdapter
を拡張する必要があります。デフォルトでは、この
public class UrlDecodeInterceptor extends HandlerInterceptorAdapter {
private static final String ATTRIBUTE_VARIBLE_PATH = "file_name";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Map<String, String> pathVariables = (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
if (pathVariables.containsKey(ATTRIBUTE_VARIBLE_PATH)) {
String decoded = URLDecoder.decode(pathVariables.get(ATTRIBUTE_VARIBLE_PATH), "UTF-8");
pathVariables.put(ATTRIBUTE_VARIBLE_PATH, decoded);
}
return true;
}
}
よう
何かが、spring-mvc
が独自にURLをデコードします。 spring-servlet.xmlまたはサーブレット設定ファイルの内容を無効にする必要があります。
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="urlDecode" value="false" />
</bean>
は、次に、あなたのコントローラハンドラがこの
@RequestMapping(value = "/file/{file_name}")
public String someMethodName(@PathVariable("file_name") String fileName) {
System.out.println(fileName); // should contain decoded file_name
return null
}
I ...丼のようになり、同じファイル末尾に
にインターセプターとして
UrlDecodeInterceptor
を登録する必要がありますそれはよりエレガントな解決策だと思う:) – saroffそれは複雑に見えるかもしれません。しかし、すべての '/ file/* 'リクエストを単一のハンドラで処理するよりも洗練されています。少なくともスケーラビリティの面では –
@ saroff私はそれについて考えている。インターセプタ部分をスキップして、自動デコードを無効にし、 'file_name'をエンコードし、ハンドラ内のpath変数をデコードします。私はある時間前にインターセプターを使って解決した1つの問題から進んだ。しかし、あなたの場合よりもやや複雑でした。 –