자바/Java URLEncoder와 URLDecoder 란?
가끔 웹 브라우저의 주소줄에 깨진 글자를 보게 되는데 이것이 바로 웹 인코딩(Encoding)된 문자
URLEncoder 클래스는 운영체제마다 일부 문자를 인식하는 방식이 다르기 때문
URLEncoder 클래스는 일반 문자열을 웹에서 통용되는 'x-www-form-urlencoded' 형식으로 변환하는 역할을 담당
대소문자, 숫자, 밑줄을 제외한 URL에 있는 문자를 코드화하는 것
▣ URLEncoder 변환규칙
◈ 아스키문자(a~z, A~Z, 1~9), '.', '-', '*', '_' : 그대로 전달
◈ 공백문자(' ') : '+' 기호로 변환됨
◈ 기타문자 : '%xy' 와 같이 세 개의 문자로 변환되며, 이 때 xy는 해당 문자의 ASCII코드를 16진수화한 결과를 두자리의 대문자로 나타낸 것이다.
▣ URLEncoder를 이용한 웹인코딩
◈ String enStr = URLEncoder.encode("네이버-www.naver.com", "EUC_KR");
반대되는 개념으로 URLDecoder 클래스는 URLEncoder로 인코딩된 결과를 디코딩하는 클래스
변환규칙은 URLEncoder 클래스의 역으로 텍스트화
▣ URLDecoder를 이용한 웹디코딩
◈ String enStr = URLEncoder.encode("네이버-www.naver.com", "EUC_KR");
◈ String deStr = URLDecoder.decode(enStr, "EUC_KR");
java.net.URLConnection
-
URL 내용을 읽어오거나, URL 주소에 GET / POST로 데이터를 전달 할 때 사용함
-
웹 페이지나 서블릿에 데이터를 전달 수 있음
-
URL --> openConnection() --> URLConnection --> getInputStream -->
InputStream (내용읽음)
-
URL 의 OpenStream() : URL의 입력 스트림만 개설 (차이점)
-
URLConnection : URL의 입력, 출력 스트림 개설
Construct
protected
URLConnection(URL) : 직접 생성 불가능 , OpenConnection으로 연결함
Method
addRequestProperty(String
a, String b) : 키(a) 와 값(b)을 가지고 요청할 수 있는
Properity 값을 미리 설정해 놓음. 특정 키값을 가지고 읽을 수 있도록 함
connect()
: 연결 된 곳에 접속 할때 (connect() 호출해야 실제 통신 가능함)
getAllowUserInteraction()
: 연결 된 곳에 사용자가 서버와 통신 할 수 있는 환경 확인(boolean)
in/output이 해당 서버 , 연결 포트로 가능한지 확인함
getContent()
: content 값을 리턴 받음 (inputStream 값을 리턴 함)
getContent(Class[])
: 위 내용을 class[] 배열 값을 입력함
getContentEncoding()
: 인코딩 타입을 String으로 리턴함
getContentLength()
: content 길이 (-1 이면 정상적으로 값이 넘어오지 않았음)
getContentType()
: content 가 http로 되어 있는지 타입 (ex: http-type )
getDate()
: content의 날짜 (new Date(~~) 으로 변환해 줘야 함 / Long 리턴)
getDefaultAllowUserInteraction():
기본적으로 User와 통신 가능한 상태인지 (boolean)
getDefaultUserCaches()
: cache를 사용할 것 인지 (boolean)
getDoInput() :
Server에서 온 데이터를 입력 받을 수 있는 상태인지 (본인 상태-default : true)
getDoOutput() :
Server에서 온 데이터를 출력 할수 있는 상태인지
(Client 상태 -default : false)
getExpiration()
: 유효 기간
getFileNameMap()
: File Name Map
getHeaderField(int)
: Head Field 값 받아옴 (http Head 값)
getHeaderFiled(String)
:
getLastModified()
: 마지막 수정 시간
getInputStream() :
InputStrema 값을 뽑아냄
getOutputStream() :
OutputStream 값을 뽑아냄
setDoInput(boolean)
: Server 통신에서 입력 가능한 상태로 만듬
setDoOutput(boolean)
: Server 통신에서 출력 가능한 상태로 만듬
-
Server와 통신을 하고자 할때는 반드시 위 두 method를 true로 해 놔야 함
URLConnection uc = null;
try{
url = new URL("http://www.korea.co.kr");
}catch(MalformedURLException me){}
try{ uc = url.openConnection(); }catch(IOException io){}
System.out.println("output = "+ uc.getDoOutput());
System.out.println("Input = "+ uc.getDoInput());
uc.setDoOutput(true); // 스트림 출력 설정
uc.setDoInput(true); // 스트림 입력 설정 -- 기본적으로 입력 스트림
OutputStream out =null;
InputStream in = null;
try{
in = uc.getInputStream();
// out = uc.getOutputStream();
}catch(IOException ie){}
System.out.println("input = "+ in.toString());
// System.out.println("out = "+ out.toString());
[예제]
URLConnection을
이용한 Web 페이지 읽어서 저장하기
import java.io.FileOutputStream;
Get
방식으로 데이터 전달함 (검색 조회해서 결과 저장함)
import java.io.BufferedReader;
Post 방식으로 데이터 전달함
[PostConnection.java]
java.net.URLEncoder -
Static method : encode(String, String)
- Encoding : 아스키 문자가 아닌 문자열들을 특수한 문자들로 변환하는 것
- 문자셋 : EUC_KR 등 뒤에 붙여줌
java.net.URLDecoder -
Static method : decode(String, String)
- static
Method 하나만 존재함
-
네트워크는 데이터를 byte로 전송함, 이를 만드는 것을 Encoder ,
해제하는 것을 Decoder라고 함
String dataconver = null;
//============ Encoder ==============//
try{
dataconver = URLEncoder.encode(data,"KSC5601"); // KSC5601 --> euc-kr
}catch(UnsupportedEncodingException ie){}
System.out.println("data = "+ data);
System.out.println("data conver = "+ dataconver);
// ============ Decoder ============== //
try{
dataconver = URLDecoder.decode(dataconver,"KSC5601");
}catch(UnsupportedEncodingException ue){}
System.out.println("data conver = "+ dataconver);
결과
data = 테스트 전송
data conver = %C5%D7%BD%BA%C6%AE+%C0%FC%BC%DB
data conver = 테스트 전송
출처
: http://zeroit.tistory.com/214
http://www.okjsp.net/seq/33202
java.net.URLEncoder.encode(URL)
을 쓰는이유가 뭐예요?url사용할때 os에 따라 문제가 발생하는데
예로
어떤 os 에서는 filename에
space를
허용하지만 URL에서는 허용하지 않고
filename에는
#을 써도 되는 os가 있지만
URL에서
#는 filename이 끝나고
다른
anchor가 온다는 것을 나타냅니다.
즉,
ref를 의미 합니다.
이럴
경우 alphanumeric character, underscores를
제외하고
URL내에 있는 모든 character를 encode해야
합니다.
encode해야
할 character들(/, #, =, &, ?, %, +, 등등)
은
ascii값이 아니라 %문자에 의해 시작되고,
16진수로
표현됩니다..
예:)
% %25
+
%2b
/
%2f
=
%3d
&
%26
This
is the test for encode.
-->
This+is+the+test+for+encode%28%29
예외:)
space
+
*
*
.
.
한글의
경우도 alphanumeric 이 아니므로
"오"
라는 2byte 글자를 encode하면 %bf%c0
이런
식으로 됩니다.
위의
내용만 아시면 다시 decode 하는건 쉬울것 같네요.
'차근차근 > JAVA JSP' 카테고리의 다른 글
getInstance() (0) | 2014.07.26 |
---|---|
request.setAttribute / request.getAttribute (0) | 2014.07.26 |
URLConnection (0) | 2014.07.26 |
Http 기초 (0) | 2014.07.26 |
Request 객체 (0) | 2014.07.26 |