2016-11-30 2 views
1

나는 데 내 컨트롤러 매핑이기 때문에 여기취급 특수 문자가

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 

'ID '에는 슬래시 (/)가 있습니다. 그래서 내가 URL을 얻을 때 400 나쁜 요청.

은 내가 가능한 해결책

  • 에게 앞으로 수 삭감하는 설정 바람둥이을 알고있다.
  • URL 인코딩을 사용하십시오.
  • @PathVariable 대신 @RequestParam을 사용하십시오.

그러나 위의 해결책은 나에게 불가능합니다.

Q. (정규 표현식을 사용하거나 매핑 또는 다른 것을 변경하는 등) 다른 문제가 있습니까? 바람둥이가 ('.', '', ':', ',')을 올바르게 처리하고 컨트롤러가 맞지 만 '/'이 아닌 다른 특수 문자를 처리하는 방법도 있습니다.

시도했지만 작동하지 :

1) @RequestMapping(value = "/info/{id:.*}", method = RequestMethod.GET) 
2) @RequestMapping(value = "/info/{id}/**", method = RequestMethod.GET) 
3) @RequestMapping(value = "/info/**", method = RequestMethod.GET) 
+0

가능한 복제 [을 일치 당신은 Base64로 구현 저장 URL을 사용해야합니다 Sp의 "나머지 URL" 반지 3 RequestMapping 주석] (http://stackoverflow.com/questions/4542489/match-the-rest-of-the-url-using-spring-3-requestmapping-annotation) – user1211

+0

하지만 왜 슬럼프 ur ID가 값? – ScanQR

+0

@TechBreak 나는 잘못 알고있다. 그러나 나는 오래된 가치에 대해 연구하고 있으며 나는 그것들을 수정할 수 없다. – SuhasD

답변

1

좋지는 않지만 Base64 transformation을 사용할 수 있습니다.

클라이언트는 id으로 인코딩 된 코드를 보내고 컨트롤러에서 다시 디코딩합니다.

import org.apache.commons.codec.binary.Base64; 

@RequestMapping(value = "/info/{id}", method = RequestMethod.GET) 
public String get(@PathVariable String id) { 
    final String realId = new String(new Base64(true).encodeBase64URLSafe(id)); 
    [...] 
} 

편집 :

+0

이것은 작동하지 않습니다. Spring은 매핑 URL을 디코딩하거나 이스케이프 해제하여 결과 URL을 기반으로 핸들러 메소드를 호출하려고 시도합니다. 따라서 잘못된 요청으로 반환됩니다. – ScanQR

+0

@TechBreak 당신이 그것을 시도 했습니까? 나는 지금 당장 노력하고있어. – dit

+0

@dit Base64는 잘 작동하지만 id에 '?'가 포함되어 있으면 문제가 발생합니다. '/'로 변환합니다. 인코딩에 '/'를 사용하지 않는 다른 인코더는 무엇입니까? – SuhasD

-1

당신은 당신의 URL을 정의하는 정규 표현식을 사용할 수 있습니다. http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates-regex

+0

Reg-EX [\\ [\\] A-Za-z0-9 \ " ',() : ._^-] +. '/'를 제외한 다른 모든 특수 문자를 처리 할 수 ​​있으며, [\\/\\ [\\] A-Za-z0-9 \ " '와 같은 Reg-EX를 수정할 경우 ._^-] + URL이 작동하지 않습니다 (심지어 이전 Reg-EX에서 작동하는 URL도 포함) – SuhasD

0

당신이 How to handle requests that includes forward slashes (/)?

같은 것을 사용할 수 있습니다 참조하지만 그것은 제한없는거야, 내가 API를 호출하는 동안 다른 '#'와 같은 뭔가 슬래시를 대체하는 당신을 제안하고 다시 교체 나머지 컨트롤러에서 슬래시를 처리하기 전에 슬래시를 전달합니다.

API를 호출하는 동안 바꿀 수 없다면 필터를 사용하고 거기에있는 데이터를 바꿀 수 있습니다.