상세 컨텐츠

본문 제목

URLConnection으로 연결시 Session값 공유하기

프로그래밍/JAVA

by 라제폰 2009. 3. 6. 20:07

본문

URLConnection으로 연결시 Session값 공유하기  

출처 : http://www.javaservice.net/

제목 : POST 방식으로 재지향하기
글쓴이: 김희용(pamsoft)   2003/01/04 12:39:46  조회수:1384  줄수:44
 
제가 여러번에 걸쳐 게시판에 질문했던 것에 대한 해결책입니다.
언젠가 여기 저기(대부분 출처가 java.sun.com 이라고 말하더군요)서 찾아보았던 요청을
POST로 넘기는 방법을 참고하여 정리한 것입니다.
새로운 방법은 아닐지 모르지만 혹시 저처럼 헤메던 분들에게 도움이 되었으면 합니다.
원래 목적은 게시물을 등록할때 파일이 포함된 것과 그렇지 않은 것을 구분하여 처리하지
않기 위함이었습니다. 제기했던 의문은 아래 게시물을 참고하십시오.
http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=qna2&c=r_p&n=1040428990

/**
*    POST 방식의 재지향
*    javax.servlet.jsp 패키지에 있는 PageContext 클래스의 forward() 메소드는
*        GET 방식으로 동작합니다.
*
*    @version 1.0
*    @author 김희용.
*    @param hsres 응답을 되돌릴 HttpServletResponse를 지정합니다.
*    @param url 재지향할 목표 URL을 지정합니다.
*    @param sParameger 재지향할때 넘겨줄 인수를 지정합니다. 인수는 URL Encoding
*                      되어있어야 합니다.
*    @exception java.io.IOException 스트림을 얻지 못할때 발생합니다.
*/
public static void postForward(javax.servlet.http.HttpServletResponse hsres,
   java.net.URL url, String sParameters) throws java.io.IOException  
{
   java.io.PrintWriter pw = hsres.getWriter();
   String sResponse;
   java.net.URLConnection urlc = url.openConnection();
   urlc.setDoOutput(true);
   java.io.OutputStreamWriter osw =  
       new java.io.OutputStreamWriter(urlc.getOutputStream());  
   osw.write(sParameters);
   osw.flush();  
   osw.close();  

   java.io.BufferedReader br =  
       new java.io.BufferedReader(
           new java.io.InputStreamReader(urlc.getInputStream())
       );  

   while((sResponse = br.readLine()) != null) pw.println(sResponse);
}

-------------------
게시판관리자 주: "HTTP POST"라는 검색어로 검색해 보세요
 

제목 : Re: 세션 유지 기능 추가
글쓴이: 김희용(pamsoft)   2003/01/05 01:45:48  조회수:848  줄수:117
 
위의 메소드는 사용자 프로그램에서 세션(쿠키)을 사용하는 경우에 올바로 동작하지
않는 문제(새 세션이 생성되는 것으로 보임)가 있어 쿠키 복제로 세션을 유지(공유)하도록
하였습니다. 수정된 메소드를 보면 쿠키를 복제하는 부분이 추가된 것을 확인 할 수
있습니다.
원래는 헤더(쿠키 포함)를 복제하려고 시도하였는데 원래 요청의
content-type이 multipart/form-data 또는 메소드가 GET일 경우 새 요청을 생성할때
content-type을 application/x-www-urlencoded로 바꾸는 것만으로는
문제가 있어서 쿠키 복제만을 하도록 선회하였습니다.

* content-type을 multipart/form-data에서 application/x-www-urlencoded로 또는
 GET 헤더를 POST 헤더로 완벽하게 바꾸는 방법을 아시는 분은 추가 부탁드립니다.
* 이것 말고 뭔가 원천적인 방법이 있을듯 한데... 헤더를 재구성하고 스트림(데이타)을
 새로 쓴다면 가능할 것도 같은데... 일단은 이렇게 해둡니다.
* encodeCookie() 메소드는 Tomcat 4.12의
 org.apache.catalina.util.RequestUtil 클래스에 있던것을 가져온 것입니다.

/**
* POST 방식의 재지향
* javax.servlet.jsp 패키지에 있는 PageContext 클래스의 forward() 메소드는
* GET 방식으로 동작합니다. 이 메소드는 POST 방식으로 forward를 수행합니다.
*
* 쿠키 복제가 추가되었습니다. 그에 따라 세션 유지가 가능하게 되었습니다.(1.1)
*
* @version 1.1
* @author 김희용.
* @param hsreq 쿠키 정보를 꺼내오기 위하여 HttpServletRequest를 지정합니다.
* @param hsres 응답을 되돌릴 HttpServletResponse를 지정합니다.
* @param url 재지향할 목표 URL을 지정합니다.
* @param sParameger 재지향할때 넘겨줄 인수를 지정합니다.
                    인수는 URL Encoding 되어있어야 합니다.
* @exception java.io.IOException 스트림을 얻지 못할때 발생합니다.
*/
public static void postForward(
           javax.servlet.http.HttpServletRequest hsreq,  
           javax.servlet.http.HttpServletResponse hsres,  
           java.net.URL url, String sParameters)
           throws java.io.IOException {

           java.io.PrintWriter pw = hsres.getWriter();
           String sResponse;
           java.net.URLConnection urlc = url.openConnection();
           urlc.setDoOutput(true);
           java.util.Iterator iHeader =  
                       java.util.Arrays.asList(hsreq.getCookies()).iterator();
           while (iHeader.hasNext())
                       urlc.setRequestProperty(
                                   "Cookie", encodeCookie((Cookie)iHeader.next())
                       );
           java.io.OutputStreamWriter osw =  
                       new java.io.OutputStreamWriter(
                                   urlc.getOutputStream()
                       );  
           osw.write(sParameters);
           osw.flush();  
           osw.close();  

           java.io.BufferedReader br =
                       new java.io.BufferedReader(
                                   new java.io.InputStreamReader(
                                               urlc.getInputStream()
                                   )
                       );  

           while ((sResponse = br.readLine()) != null)
                       pw.println(sResponse);
}

/**
* Encode a cookie as per RFC 2109.  The resulting string can be used
* as the value for a Set-Cookie header.
*
* @param cookie The cookie to encode.
* @return A string following RFC 2109.
*/
public static String encodeCookie(Cookie cookie) {

           StringBuffer buf = new StringBuffer( cookie.getName() );
           buf.append("=");
           buf.append(cookie.getValue());

           if (cookie.getComment() != null) {
                       buf.append("; Comment=\"");
                       buf.append(cookie.getComment());
                       buf.append("\"");
           }

           if (cookie.getDomain() != null) {
                       buf.append("; Domain=\"");
                       buf.append(cookie.getDomain());
                       buf.append("\"");
           }

           long age = cookie.getMaxAge();
           if (cookie.getMaxAge() >= 0) {
                       buf.append("; Max-Age=\"");
                       buf.append(cookie.getMaxAge());
                       buf.append("\"");
           }

           if (cookie.getPath() != null) {
                       buf.append("; Path=\"");
                       buf.append(cookie.getPath());
                       buf.append("\"");
           }

           if (cookie.getSecure()) {
                       buf.append("; Secure");
           }

           if (cookie.getVersion() > 0) {
                       buf.append("; Version=\"");
                       buf.append(cookie.getVersion());
                       buf.append("\"");
           }

           return (buf.toString());

 

관련글 더보기