2017-07-12 13 views
3

を文字スラッシュ春 - 私はGETメソッドを持つGET URLに

@RequestMapping(
     value = "/path/{field}", 
     method = RequestMethod.GET 
) 
public void get(@PathVariable String field) { 
} 

フィールドが発見されていないパスになり「/他のいくつかの/こと」のように、スラッシュを含めることができます。それは "//////////////"のようなものでもあります。いくつかの例は:{:*。フィールド}と%2Fでスラッシュをエスケープするが、それはまだ方法に到達しません

www.something.com/path/field //works 
www.something.com/path/some/thing 
www.something.com/path/////////// 

私が試してみました。手助け?

+0

field2に/が含まれている場合、同じURLではありません。それは期待された行動ですか? – Nathan

+1

[スラッシュ(/)?](https://stackoverflow.com/questions/31421061/how-to-handle-requests-that-includes-forward-slashes)を含むリクエストを処理する方法 – ares

+0

これは可能ではありません私のフィールドにはスラッシュをいくつでも入れることができますが、 "/////////////"にすることもできます。 –

答えて

1

私は春ブーツのために、問題を解決してきました。まず、エンコードされたスラッシュを許可するようにSpringを設定する必要があります。

@Configuration 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Bean 
    public HttpFirewall allowUrlEncodedSlashHttpFirewall() { 
     DefaultHttpFirewall firewall = new DefaultHttpFirewall(); 
     firewall.setAllowUrlEncodedSlash(true); 
     return firewall; 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.httpFirewall(allowUrlEncodedSlashHttpFirewall()); 
    } 
} 

次に、あなたは、組み込みのTomcatからそれを許可する必要があります。

public class Application extends WebMvcConfigurerAdapter { 

    public static void main(String[] args) { 
     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); 
    } 
} 

これは動作しますが、それを行うための最善の方法は、だけではなく、クエリパラメータを使用することです。

0

いつかこのような問題が発生しました。次のように私はそれを解決したように見えます。

@RequestMapping(value = "/{field:.*}") 
... 
String requestedField = URLDecoder.decode(field) 
+0

私が言ったように、私は{field:。*}を使ってみましたが、私は404のコードストリングrequestedField = URLDecoder.decode(field)には決して行きません。 –

0

JeremyGrandあなたは**を使用して、ルートと一致して、自分でパスを解析でき示唆したように:

@GetMapping("/path/**") 
public String test(HttpServletRequest request) { 
    return request.getRequestURI(); //do some kind of parsing 
} 
+0

私が与えた例は単純化されたもので、実際のURLは/ path1/field1/path2/field2/path3/field3のようなものです。この場合、/ path1/**を実行するとハックのように見えます。 –

関連する問題