차근차근/JAVA JSP

자바/Java URLEncoder와 URLDecoder

예쁜꽃이피었으면 2014. 7. 26. 01:40

http://arabiannight.tistory.com/entry/%EC%9E%90%EB%B0%94Java-URLEncoder%EC%99%80-URLDecoder-%EB%9E%80

자바/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"); 

 

http://ggoreb.tistory.com/114

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로 해 놔야 함

URL url = null;
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 페이지 읽어서 저장하기

 

[WebSpiderWithURLConnection.java]
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;


public class WebSpiderWithURLConnection {
public static void main(String[] args){
if(args.length != 2){
System.out.println("사용법 : java WebSpider URL filename");
System.exit(1);
}
URL url = null;
try{
url = new URL(args[0]);
} catch(MalformedURLException e1){
System.out.println("잘못된 URL 형식입니다.");
System.out.println(e1);
System.exit(1);
}
FileOutputStream fos = null;
try{
URLConnection urlcon = url.openConnection();
String contentType = urlcon.getContentType();
long d1 = urlcon.getDate();
Date d = new Date(d1);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
String sdata = format.format(d);
System.out.println("Content Type :" + contentType);
System.out.println("읽어온 시간 : "+ sdata);
InputStream in = urlcon.getInputStream();
fos = new FileOutputStream(args[1]);
byte[] buffer = new byte[512];
int readcount  =0;
System.out.println("읽어 오기 시작 ");
while((readcount = in.read(buffer)) != -1){
fos.write(buffer,0,readcount);
}
System.out.println(args[1] + "파일에 모두 저장했습니다.");
}catch(Exception ex){
System.out.println(ex);
}finally{
try{
if(fos != null)fos.close();
}catch(Exception e){
}
}
}
}

 



Get 방식으로 데이터 전달함 (검색 조회해서 결과 저장함)

 

[GetSearch.java]
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;


public class GetSearch {
public static void main(String[] args){
if(args.length != 2){
System.err.println("사용법 : java  GetSearch  keyword  filename");
System.exit(1);
}
try{
String keyword = URLEncoder.encode(args[0]);
String query = "query="+keyword+"&frm=t1&sm=top_hty";
System.out.println(u + query);
URL url = new URL(u);
URLConnection connection = url.openConnection();
HttpURLConnection hurlc = (HttpURLConnection)connection;
hurlc.setRequestMethod("GET");
hurlc.setDoOutput(true); // 쓰는 기능 on
hurlc.setDoInput(true); // 읽어 들임 기능 on
hurlc.setUseCaches(false);
hurlc.setDefaultUseCaches(false);
PrintWriter out = new PrintWriter(hurlc.getOutputStream()); // 
out.println(query);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(hurlc.getInputStream()));
PrintWriter pw = new PrintWriter(new FileWriter(args[1]));
String inputLine = null;
while((inputLine = in.readLine()) != null){
pw.println(inputLine);
}
in.close();
pw.close();
System.out.println("검색 결과가 " + args[1] + "파일에 저장되었습니다.");
}catch(Exception ex){
System.out.println(ex);
}
}
}

 


Post 방식으로 데이터 전달함

[PostConnection.java] 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;


public class PostConnection {
public static void main(String[] args){
if(args.length != 2){
System.out.println("사용법 : java Postconnection id password");
System.exit(1);
}
try{
String id = URLEncoder.encode(args[0]);
String passwd = URLEncoder.encode(args[1]);
String query = "id="+id+"&passwd="+passwd;
System.out.println(u + query);
URL url =new URL(u);
URLConnection connection = url.openConnection();
HttpURLConnection hurlc = (HttpURLConnection)connection;
hurlc.setRequestMethod("POST");
hurlc.setDoOutput(true);
hurlc.setDoInput(true);
hurlc.setUseCaches(false);
hurlc.setDefaultUseCaches(false);
PrintWriter out = new PrintWriter(hurlc.getOutputStream());
out.println(query);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(hurlc.getInputStream()));
String inputLine = null;
while((inputLine = in.readLine()) != null){
System.out.println(inputLine);
}
in.close();
}catch(Exception ex){
System.out.println(ex);
}
}
}

 




java.net.URLEncoder - Static method : encode(String, String)
    - Encoding : 아스키 문자가 아닌 문자열들을 특수한 문자들로 변환하는 것 

String  encodeStr = URLEncoder.encode(str,"EUC_KR");

    - 문자셋 : EUC_KR 등 뒤에 붙여줌
    
java.net.URLDecoder - Static method : decode(String, String)

String  decodeStr  = URLDecoder.decode(str,"EUC_KR");



- static Method 하나만 존재함
- 네트워크는 데이터를  byte로 전송함, 이를 만드는 것을 Encoder , 
  해제하는 것을 Decoder라고 함

  String data = "테스트 전송";
  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