문서의 이전 판입니다!
URL escape / encoding
URLEncoder.encode() 메소드를 써도 되지만 이 기능은 파라메터로 넘어온 모든 문자열을 인코딩한다.
따라서 아래와 같은 문자열을 입력할 경우
public static void main(String[] args) throws Exception {
String url = "https://test.com/call.jsp?pararm=한글파라메터";
System.out.println(URLEncoder.encode(url, "UTF-8"));
}
출력결과 : https%3A%2F%2Ftest.com%2Fcall.jsp%3Fpararm%3D%ED%95%9C%EA%B8%80%ED%8C%8C%EB%9D%BC%EB%A9%94%ED%84%B0
위와같이 https://test.com/call.jsp?param= 과 같이 인코딩이 필요하지 않은 부분까지 모두 인코딩을 해 버린다.
따라서 URLEncoder.encode() 메소드는 필요한 값만 인코딩 할때 사용하여야 하므로 인코딩이 필요한 부분을 문자열에서 추출해서 적용해야 하는 번거로움이 있다
이것을 해결하려면 아래와 같이 URL 클래스와 URI클래스를 사용하여 URL의 요소를 분리하여 적용하면 해결된다.
/**
* URL에서 인코딩이 필요한 부분만 escape해서 리턴해줌
* URLEncoder.encode()를 사용하면 입력된 모든 문자열을 인코딩함. 그래서 이걸 써야함.
* @param urlStr
* @return
*/
public static String escapeURL(String urlStr) {
String result = null;
if (urlStr == null) {
return result;
}
try {
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
log.debug(uri.toASCIIString());
result = uri.toASCIIString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}