2017-04-18 160 views
2

我必須在SpringBoot應用程序中使用@PathValiable從URL獲取參數。這些參數通常有斜線。我無法控制用戶在URL中輸入的內容,因此我想要獲取他輸入的內容,然後我可以處理它。SpringBoot中的@PathVariable在URL中使用斜槓

我已經瀏覽過這裏的資料和答案,我不認爲對我來說,最好的解決方案是讓用戶以某種方式編碼輸入的參數。

的SpringBoot代碼很簡單:

@RequestMapping("/modules/{moduleName}") 
@ResponseBody 
public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception { 

    ... 

} 

因此,例如URL可能如下:

http://localhost:3000/modules/... 

的問題是,帕拉姆MODULENAME往往有斜線。 例如,

metadata-api\cb-metadata-services OR 
app-customization-service-impl\\modules\\expand-link-schemes\\common\\app-customization-service-api 

所以definetely用戶可以輸入:

http://localhost:3000/modules/metadata-api\cb-metadata-services 

這是可能得到什麼用戶後/模塊/在網址中輸入的一切嗎?

如果有人告訴我什麼是處理此類問題的好方法。

回答

2

這段代碼獲得完整的路徑:

@RequestMapping(value = "/modules/{moduleBaseName}/**", method = RequestMethod.GET) 
@ResponseBody 
public String moduleStrings(@PathVariable String moduleBaseName, HttpServletRequest request) { 
    final String path = 
      request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString(); 
    final String bestMatchingPattern = 
      request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString(); 

    String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path); 

    String moduleName; 
    if (null != arguments && !arguments.isEmpty()) { 
     moduleName = moduleBaseName + '/' + arguments; 
    } else { 
     moduleName = moduleBaseName; 
    } 

    return "module name is: " + moduleName; 
} 
+0

我可以調用_localhost:8080/modules/abc_返回「模塊名稱爲:abc」和_localhost:8080/modules/abc/def_,它返回「模塊名稱爲:abc/def」。你是否在url中加入了反斜槓? –

+0

它真的進入了這個方法。那很好。但是,由於某些原因它出現在循環中(每次都會返回MANY TIMES和moduleName更改語句)。 –

+0

太棒了!只需添加@ResponseBody。這真的很有用! –

0
@RequestMapping("/modules/**") 
+0

這裏不清楚將包含輸入參數的變量是什麼。 –

0

基礎上P.J.Meisch的答案我來爲我的情況下,簡單的解決方案。此外,它還允許在URL參數中考慮多個斜線。它也不允許像以前的回答一樣使用反斜槓。

@RequestMapping(value = "/modules/**", method = RequestMethod.GET) 
@ResponseBody 
public String moduleStrings(HttpServletRequest request) { 

    String requestURL = request.getRequestURL().toString(); 

    String moduleName = requestURL.split("/modules/")[1]; 

    return "module name is: " + moduleName; 

}