자바 Split 함수 사용시에 "|" 로 자르는 경우 

엉뚱하게 잘리는 현상이 있다.


"\\|" 로 자르면 제대로 잘려진다.

json 파싱하기


이런 json 포맷을 이해할 수 있는 자료형으로 파싱하기 위한 다양한 라이브러리들이 있습니다.


기본적으로 java의 JsonObject와 JsonArray로 json을 파싱할 수 있습니다.


{

    "name": "hello!",

    "data": {

        "name": "jspiner",

        "age": 8,

        "birth": 1996

    },

    "friends": [

        "john",

        "smith",

        "sam"

    ],

    "books": [

        {

            "name": "book1",

            "price": 10000

        },

        {

            "name": "book2",

            "price": 15000

        },

        {

            "name": "book3",

            "price": 7000

        }

    ]

}




JsonParser jsonParser = new JsonParser();


JsonObject jsonObject = (JsonObject) jsonParser.parse(json);

JsonObject dataObject = (JsonObject) jsonObject.get("data");


System.out.print("name : " + dataObject.get("name"));

System.out.print("age : " + dataObject.get("age"));

System.out.print("birth : " + dataObject.get("birth"));







직렬화(Serialization) 이용하기


직렬화란 객체를 직렬화하여 전송 가능한 형태로 만드는것을 의미한다. 객체들의 데이터를 특정한 포맷의 연속적인 데이터로 변형하여 데이터를 읽도록 하는 것이다.


java에서는 직렬화를 지원하는 Gson Jackson등의 라이브러리가 있다.


JsonObject로 파싱하던 위 코드를 Gson으로 파싱하기 위해선 우선 객체를 담을 클래스를 구현한다.




class DataJson {


    @SerializedName("name")

    public String name;


    @SerializedName("data")

    public Data data;


    @SerializedName("books")

    public List<Book> books;


    class Data{

        @SerializedName("name")

        public String name;


        @SerializedName("age")

        public int age;


        @SerializedName("birth")

        public int birth;

    }


    class Book{

        @SerializedName("name")

        public String name;


        @SerializedName("price")

        public int price;

    }


}

// @SerializedName은 파싱할때 사용될 key 이름이다.




DataJson dataJson= new Gson().fromJson(json, DataJson.class);


System.out.println("name : " + dataJson.name);


for(DataJson.Book book : dataJson.books){

    System.out.println("book name : " + book.name);

    System.out.println("book price : " + book.price);

}



출처:https://calyfactory.github.io/%EC%A0%9C%EC%9D%B4%EC%8A%A8%ED%8C%8C%EC%8B%B1/

XFF 는 HTTP Header 중 하나로 HTTP Server 에 요청한 clinet 의 IP 를 식별하기 위한 사실상의 표준이다.

 

웹 서버나 WAS 앞에 L4 같은 Load balancers 나 Proxy server(HAProxy), caching server(Varnish), HTTP 서버용 WAS Connector(웹로직 커넥터 - mod_wl, 톰캣 커넥터 - mod_jk 등) 등이 있을 경우

이런 제품들은 웹서버/WAS 에 HTTP 나 전용 프로토콜(AJP)로 요청을 보낸후에 받은 결과를 가공하여 클라이언트에 재전송하게 된다.

이로 인해 처리한 웹 서버나 WAS에서 request.getRemoteAddr(); 등으로 클라이언트 IP를 얻을 경우 L4 나 Proxy 의 IP 를 얻게 되는데 이는 원하는 결과가 아니다.

 

X-Forwarded-For는 이 문제를 해결하기 위해 사용하는 http header 로 squid caching server 에서 처음 사용되었다.

다음과 같이 콤마를 구분자로 client 와 proxy IP 가 들어가게 되므로 첫번째 IP 를 가져오면 클라이언트를 식별할 수 있다.

X-Forwarded-For: client, proxy1, proxy2

 

WAS 에서 사용

여기까지 읽고 웹 어플리케이션을 개발할 경우 client ip 를 식별할 필요가 있다면 먼저 저 헤더가 있는지 확인한 후에 없으면 getRemoteAddr() 로 IP 를 얻으면 되겠지라고 생각할 수도 있겠지만 이게 끝은 아니다.

XFF 는 사실상의 표준이지 정식 RFC 에 포함된게 아니므로 대개는 착실하게 저 헤더를 사용하지만 엉뚱한 헤더를 사용하는 제품들이 있다.

그중에 하나인 WebLogic Connector(mod_wl) 는 저 헤더를 사용하지 않고 WL-Proxy-Client-IP 나 Proxy-Client-IP  같은 전혀 엉뚱한 헤더를 사용하므로 만약 만드는 웹 어플리케이션이 

WebServer, WAS, L4, proxy 종류에 상관없이 client IP 를 잘 가져오기를 바란다면 다음과 같은 순서로 IP 를 얻어내야 한다.

 

 String ip = request.getHeader("X-Forwarded-For");
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
 }

이외에도 X-Real-IP 나 X-RealIP 라는 헤더를 사용하는 제품도 있다고 한다.

 

Apache httpd Web Server 에서 사용

아파치 웹 서버에서는 LogFormat 지시자나 접근 권한 체크시 Remote Address 를  사용하는데 앞에 Reverse Proxy가 있다면 의도한 대로 동작하지 않으므로 XFF 헤더를 사용하도록 수정해야 한다.

 

로그포맷

기본 로그포맷은 %h 로 리모트 Address 를 사용하므로 다음과 같이 %{X-Forwarded-For}i 를 사용하도록 수정한다.

## 수정전
## LogFormat "%h %l %u %t \"%r\" %>s %b" common
  
## 수정후
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common

접근 제어(ACL)

ACL이 필요할 경우 다음과 같이 전역 변수를 설정하고 ACL 이 필요한 곳에서 이 변수를 사용하는게 편리하다.

SetEnvIf X-Forwarded-For ^192\.168\.1\. admin_1
SetEnvIf X-Forwarded-For ^192\.168\.2\. admin_2
  
<Files wp-config.php>
    order Deny,Allow
    deny from all
</Files>
 
## 워드프레스 로그인은 내부 IP 에서만 허용
<Files ~ "^wp-login.php">
    Order Deny,Allow
    Deny from all
## 내부 IP 만 관리자 로그인 허용
    Allow From env=admin_1
    Allow From env=admin_2
</Files>

 

nginx

nginx 는 --with-http_realip_module 옵션을 주고 컴파일해야 실제 ip 를 얻어올 수 있다. 배포판에 포함된 nginx 는 기본 컴파일 옵션일것이라고 생각되며 다음 명령어로 지원 여부를 확인할 수 있다.

nginx -V

 

nginx 가 지원한다면 다음 설정을 nginx.conf 에 넣어주면 실제 ip 가 로그 파일에 기록된다.

http {
set_real_ip_from   127.0.0.1; # proxy/L4 서버 IP
real_ip_header      X-Forwarded-For; #proxy/L4 가 실제 IP 를 설정하는 HTTP Header


'Server Enterprise > Java' 카테고리의 다른 글

[Split] | 자르기  (0) 2018.04.26
[Java] Json 파싱  (0) 2018.03.05
[알고리즘] 문제 출제 및 유용한 사이트  (0) 2016.08.08
[Java] Design Pattern  (0) 2016.07.07
[Book] 알고리즘 관련 서적 for java  (0) 2016.07.05

오일러 프로젝트(Project Euler)


수학적인 문제들을 프로그래밍으로 해결하는 퀴즈 풀이 사이트


Synap에서 한글로 번역한 사이트를 제공하고 있다. 본 사이트의 모든 문제가 번역되어 있진 않지만 현재 100여개의 문제가 번역되어 있고 많은 사람들이 사용하고 있다. 자신이 원하는 언어로 문제를 풀고 답만 입력하면 된다. 입력한 답이 정답일 경우 다른 사람들이 문제를 푼 코드들을 볼 수 있다.


(Project Euler @kr : http://euler.synap.co.kr/)


(Project Euler @net : https://projecteuler.net/)





알고 스팟(Algospot)


프로그래밍 대회에서 배우는 '알고리즘 문제해결 전략'의 저자 구종만씨가 운영하는 사이트


C, Java, Python, C++, Scala, Javascript, Rust, Haskell, Go등 다양한 언어로 문제 풀이가 가능하며 문제별 채점결과(속도, 크기) 랭킹을 제공해준다. 다양한 알고리즘 대회의 양질의 문제들을 제공해 주고 있다. 알고스팟 캘린더에는 알고리즘 대회 스케쥴을 제공해 주고 있다. 국내 알고리즘 사이트 중에서는 Dovelet과 함께 양강체제를 구축하고 있다. 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.


(Algospot : https://algospot.com/)




더블릿(Dovelet)


알고 스팟과 양대산맥을 이루는 알고리즘 트레이닝 사이트


C, Java, Python, C++, Perl로 문제 풀이가 가능하다. 1~30계단, 옥상으로 단계를 구분해서 운영하고 있는데 무료로 1~3계단, 옥상 레벨의 문제를 풀 수가 있다. 정회원이 되려면 소정의 금액을 지불해야 한다. 랭킹 30위 안에 들면 1년 이상 무료로 이용이 가능하다. 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.


(Dobelet : http://59.23.113.171/index.php)




코딜리티(Codility)


해외에서 정말 유명한 알고리즘 문제 사이트


문제가 영어로 제공되어 해석의 어려움이 있을 수는 있지만 Web에서 코드를 작성하고 컴파일 결과를 확인할 수 있는 장점이 있다. 코드를 제출하게 되면 시간 복잡도와 공간 복잡도를 서버에서 채점하고 등급을 알려준다. 많은 언어를 제공하며 완성도가 높은 사이트이다. 마찬가지로 코딩 테스트를 준비하고 있다면 반드시 풀어봐야 할 사이트.


(Codility : https://codility.com/)




코딩도장


운동 도장에 매일 다니며 수련하는 것 같이 프로그래밍 문제풀이를 통해서 코딩 실력을 수련하자는 목표로 만들어진 사이트


구글, 페이스북등 유명 해외 기업과 국내 유명 기업의 코딩 문제들도 수록되어 있다. 채점은 되지 않지만 풀이를 댓글로 작성할 수 있고 다른 사람들의 풀이도 볼 수 있다.


(코딩도장 : http://codingdojang.com/)

1. 자바 디자인 패턴 1 – Iterator

 

2. 자바 디자인 패턴 2 – Adapter

 

3. 자바 디자인 패턴 3 - Factory Method

 

4. 자바 디자인 패턴 4 - Template Method

 

5. 자바 디자인 패턴 5 – Singleton

 

6. 자바 디자인 패턴 6 – Strategy

 

7. 자바 디자인 패턴 7 – Composite

 

8. 자바 디자인 패턴 8 – Decorator

 

9. 자바 디자인 패턴 9 - Chain of Responsibility

 

10. 자바 디자인 패턴 10 – Facade


11. 자바 디자인 패턴 11 – Observer

 

12. 자바 디자인 패턴 12 – Prototype

 

13. 자바 디자인 패턴 13 – Flyweight

 

14. 자바 디자인 패턴 14 – Builder

 

15. 자바 디자인 패턴 15 – Mediator

 

16. 자바 디자인 패턴 16 – Visitor



http://www.sws.bfh.ch/~amrhein/ADP/HeadFirstDesignPatterns.pdf


다양한 예제로 학습하는 데이터 구조와 알고리즘 for Java

public class StringFinder {
    public static void main(String[] args) {

        String txt1 = "가나다라" ;
        String txt2 = "해당 내용은 테스트 입니다" ;
        String txt3 = "가격은 29,000원 입니다" ;

        // contains를 이용한 방법(true, false 반환)
        if(txt1.contains("나다"))
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // indexOf를 이용한 방법
        if(txt2.indexOf("테스트") > -1)
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // matches를 이용한 방법
        if(txt2.matches(".*테스트.*"))
            System.out.println("문자열 있음!");
        else
            System.out.println("문자열 없음!");
         
         
        // matches를 이용하여 정규 표현식으로 문자열에 숫자가 있는지 확인
        if(txt3.matches(".*[0-9].*"))
            System.out.println("숫자 있음!");
        else
            System.out.println("숫자 없음!");
    }
}

contains문자열에 검색하고자 하는 문자가 있는지 확인 : 포함 - true / 미포함 - false
indexOf 문자열에서 검색하는 문자의 위치를 반환 : 포함 - 문자 위치 / 미포함 - ( -1 )
matches 정규식을 이용하여 문자열을 검색한다, 특정 문자열을 검색할때 사용하기 보다는 한글, 숫자 등과 같이 해당 형태의 텍스트가 존재하는지 확인할때 사용하면 좋다 : 포함 - true / 미포함 - false



출처 : http://fruitdev.tistory.com/72


'Server Enterprise > Java' 카테고리의 다른 글

[Java] Design Pattern  (0) 2016.07.07
[Book] 알고리즘 관련 서적 for java  (0) 2016.07.05
[random] java.security.SecureRandom  (0) 2016.01.12
[Request] 호스트 설정 jsp  (0) 2016.01.12
URL Encoding 특수문자 코드  (0) 2015.07.22



SecureRandom random = new SecureRandom ();

//랜던 문자 길이

int numLength = 16;

String randomStr = "";


for (int i = 0; i < numLength; i++) {

//0 ~ 9 랜덤 숫자 생성

//randomStr += ran.nextInt(10);

randomStr += random.nextInt(10);

System.out.println("randomStr "+ i + " :: " + randomStr);

}




아래 출처 : https://jonghwasu.wordpress.com/2013/02/15/%EA%B0%95%EB%A0%A5%ED%95%9C-%EB%82%9C%EC%88%98%EB%A5%BC-%EC%83%9D%EC%84%B1-%ED%95%9C%EB%8B%A4/



  • 강력한 난수를 생성한다.
    • 의사 난수 생성기는 좋은 통계적 성질을 가진 일련의 수 배열을 생성하는 결정성 수학 알고리즘을 사용
    • 그러나 숫자 배열이 진정한 난수성을 갖지는 않는다.
    • 의사 난수 생성기는 일반적으로 초깃값(seed value)으로 시작한다.
    • 알고리즘은 이 초깃값을 사용해 난수를 생성하고 새로운 초깃 값을 만들고, 다시 이 초깃 값을 사용해 그 다음 난 수 값을 만든다.
  • 자바 API는 java.util.Random 클래스로 의사 난수 생성기를 구현한다.
    • 의사 난수 생성기는 이식 할 수 있고 반복될 수 있다.
    • 따라서 동일한 초깃값을 사용해 생성한 두개의 java.util.Random 객체는 모든 자바 구현에서 동일한 숫자 배열을 생성하게 된다.
    • 어플리케이션을 초기화 하거나 시스템이 재 시동된 후에 초깃값이 재 사용되곤 한다.
    • 또는 시스템 클럭에서 가져온 현재 시간에서 유도하여 초깃 값으로 사용하기도 한다.
  • 부적합 코드예
    • 이 클래스는 모든 주어진 초깃 값에 대해 동일한 숫자 배열을 생성한다. 따라서 앞으로 나올 숫자를 예상 할 수 있다.
    1
    2
    3
    4
    5
    6
    Random rand1 = new Random(123L);
     
    /* [0,20] 범위에 있는 또다른 정수현 난수를 생성한다. */
    int n = rand1.nextInt(21);
    System.out.println("Random1 =================================================");
    System.out.println(n);
  • 적합 코드 예
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* java.security.SecureRandom 클래스를 사용해 고품질의 난수를 만들어낸다. */
    SecureRandom rand3 = null;
    try {
        rand3 = SecureRandom.getInstance("SHA1PRNG");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
     
    System.out.println("SecureRandom============================================");
    n = rand3.nextInt(21);
    System.out.println(n);
  • 적합 코드 예
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Random의 기본 생성자를 이용하면 생성자를 호출 할 때 마다 다른 값을 초기 값으로 가져올 수 있다. */
    Random rand2 = new Random();
    System.out.println("Random2 =================================================");
    for(int i = 0; i < 20; i++) {
        /* 난수 생성기의 초깃값을 다시 설정 */
        rand2 = new Random();
        n = rand1.nextInt(21);
        System.out.println(n);
    }

String svrHost = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort();

print) svrHost    ::    http://localhost:8080


if (svrHost.matches("(?i).*127.0.0.1:8080.*")){ // (?i).*내용.* ==> 대소문자 구분없이

// local logic

} else if (svrHost.matches("(?i).*10.185.130.23:6010.*")) {

// dev logic

else if (svrHost.matches("(?i).*http://www.domain.co.kr.*") || svrHost.matches("(?i).*http://domain.co.kr.*")) {

// http prd logic

} else if (svrHost.matches("(?i).*https://www.domain.co.kr.*") || svrHost.matches("(?i).*https://domain.co.kr.*")) {

// https prd logic

} else { }



ServletRequest와 HttpServletRequest의 구분

 

 ServletRequest는 기본적인 클라이언트 요청에 관한 모든 정보를 가지고 있습니다. 그리고 이 인터페이스는 다시 HttpServletRequest로 확장하여 HTTP프로토콜상에서 할 수 있는 일들이 포함되어져 있습니다. 이 HttpServletRequest는 서블릿의 service의 매개변수의 하나로 서블릿 프로그래머가 클라이언트의 요청에 관한 작업들을 핸들할 수 있도록 하는 중요한 역할을 담당하고 있습니다. ServletRequest인터페이스의 구조를 살펴보면 다음과 같은 부분으로 나눌 수 있습니다.

 

ServletRequest의 구조

n        클라이언트 자체에 대한 정보추출

n        클라이언트가 전송한 정보 추출

 

 이러한 구조에 따라서 ServletRequest의 메서드를 분류해 보면 다음과 같습니다.

 

ServletRequest의 멤버메서드

클라이언트 자체에 대한 정보추출

Object getAttribute(String name): 주어진 이름을 갖는 속성값을 얻습니다.

Enumeration getAttributeNames(): 이 요청이 갖는 속성들의 이름에 대한 Enumeration 객체를 얻습니다.

void setAttribute(String key, Object o): 주어진 이름의 속성을 설정합니다.

void remvoeAttribute(String key): 주어진 이름의 속성을 제거합니다.

String getProtocol(): "HTTP/1.1" 과 같은 형식으로 프로토콜 및 major/minor 버전을 얻습니다.

String getRemoteAddr(): 요청한 클라이언트의 IP(Internet Protocol) 주소를 얻습니다.

String getRemoteHost(): 요청한 클라이언트의 호스트 이름을 얻습니다.

String getScheme(): http, https, 또는 ftp 등과 같은 요청을 위해 사용된 방법의 이름을 얻습니다.

String getServerName(): 요청을 받은 서버의 이름을 얻습니다.

int getServerPort(): 요청을 받은 포트 번호를 얻습니다.

 

ServletRequest의 멤버메서드

클라이언트가 전송한 정보추출

String getCharacterEncoding(): 이 요청에 사용된 문자 인코딩을 얻습니다.

int getContentLength(): 이 요청에 포함되어 있는 데이터의 길이를 구하며, 만약 길이를 알 수 없는 경우에는 ?1이 리턴됩니다.

String getContentType(): 요청에 포함되어 있는 내용에 대한 MIME 타입 또는 모를 경우에는 null을 얻습니다.

Enumeration getParameterNames(): 매개변수들의 이름에 대한 Enumeration 객체를 얻습니다.

String getParameter(String name): 주어진 이름의 매개변수가 갖는 값을 얻습니다.

String[] getParameterValues(String name): 주어진 이름으로 전달된 매개변수가 갖는 모든 값을 문자열 배열로 얻습니다. 매개변수가 다중 선택이 가능한 리스트(list) 또는 선택박스(choicebox)의 값이라면, 여러 개의 값이 하나의 이름으로 전달될 수 있습니다.

BufferedReader getReader(): 요청 바디로부터 문자 인코딩에 따라 텍스트를 읽어들이기 위한 BufferedReader 객체를 얻습니다.

ServletInputStream getInputStream(): 이 요청의 바디로부터 바이너리 데이터를 읽어들이기 위해, 한 번에 한 라인씩 읽을 수 있는 ServletInputStream 객체를 얻습니다.

 

이와 같은 메서드들은 HTTP 프로토콜에 맞추어져 있는 것이 아니라 일반적인 네트웍 통신기반에 의해서 사용되는 메서드입니다. 그래서 HTTP프로토콜에 존재하는 Session과 Cookie같은 정보를 추출하는 작업은 할 수 없습니다. 그렇기 때문에 HTTP프로토콜을 지원하는 HttpServletRequest에서는 당연히 HTTP프로토콜에 사용되는 대부분의 기능을 포함하고 있습니다. HTTP프로토콜상에서 사용되는 기능별로 분류해 보면 다음과 같습니다.

 

HttpServletRequest의 기능별 분류

n        request객체의 요청 파라미터

n        request객체의 HTTP 헤더

n        request객체의 세션 데이터

n        request객체의 쿠키

n        request객체의 요청에 사용된 URL/URI

 

이러한 분류에 따라 메서드를 나누어 보면 다음과 같습니다.

 

request객체의 요청 파라미터

public String getParameter(String name) : 주어진 이름의 매개변수가 갖는 값을 얻습니다. 지정된 이름의 파라미터가 존재하지 않을 경우 null을 반환합니다.

public Enumeration getParameterNames(): 매개변수들의 이름에 대한 Enumeration으로 반환합니다.

public String[] getParameterValues(String name) : 주어진 이름으로 전달된 매개변수가 갖는 모든 값을 문자열 배열로 얻습니다. 매개변수가 다중 선택이 가능한 리스트(list) 또는 선택박스(choicebox)의 값이라면, 여러 개의 값이 하나의 이름으로 전달될 수 있지만 매개변수가 하나의 값을 갖는 경우라면 getParameter(String name)를 사용하는 것이 낫습니다.

 

 

request객체의 HTTP 헤더

public String getHeader(String headerName) : HTTP 요청헤더에 지정된 headerName의 값을 문자열로 반환합니다. 만약 HTTP 요청헤더에 headerName의 값이 존재하지 않는다면 null을 반환합니다.

public Enumeration getHeaderNames() : HTTP 요청헤더에 포함된 모든 헤더의 이름을 Enumeration으로 반환합니다.

public Enumeration getHeaders (String headerName) : HTTP 요청헤더에 포함된 headerName의 모든 값을 Enumeration으로 반환합니다.

public int getIntHeader (String headerName) : HTTP 요청헤더에 포함된 headerName의 값을 int로 반환합니다. 지정된 headerName의 값을 int로 변환 할 수 없는 경우 NumberFormatException이 발생하고 headerName 헤더가 HTTP 요청헤더에 존재하지 않을 경우에는 –1을 반환합니다.

public long getIDateHeader (String headerName) : HTTP 요청헤더에 포함된 headerName의 값을 millisecond 변환하여 long으로 반환합니다. 지정된 headerName의 값을 int로 변환 할 수 없는 경우 IllegalArgumentException이 발생하고 headerName 헤더가 HTTP 요청헤더에 존재하지 않을 경우에는 –1을 반환합니다.

 

request객체의 세션 데이터 

public HttpSession getSession() : 요청을 시도한 클라이언트에 지정된 HttpSession 객체를 얻습니다.  이전에 생성된 HttpSession 객체가 없었다면 새로운 세션 객체를 생성합니다. 

public HttpSession getSession(boolean create) : 요청을 시도한 클라이언트에 지정된 HttpSession 객체를 얻습니다. create가 false로 지정된 경우 해당 클라이언트에 대해 생성된 HttpSession 객체가 없는 경우 null을 반환합니다. create가 treu로 지정된 경우 이미 생성된 HttpSession 객체를 반환하고 만약 해당 클라이언트에 생성된 HttpSession 객체가 없는 경우 새로운 세션 객체를 생성하여 리턴합니다.

public String getRequestedSessionId(): 요청을 시도한 클라이언트의 세션 id를 문자열로 반환합니다.

public String isRequestedSessionId() : 요청을 시도한 클라이언트의 세션 id가 유효하면 true 아니면 false를 리턴합니다.

isRequestedSessionIdFromCookie() : 요청을 시도한 클라이언트의 세션 id가 쿠키로 전달된 경우 true 아니면 false를 리턴합니다.

isRequestedSessionIdFromURL() : 요청을 시도한 클라이언트의 세션 id가 URL에 포함된 경우 true 아니면 false를 리턴합니다.

 

request객체의 쿠키 

public Cookie[] getCookies() : 클라이언트의 요청에 포함된 쿠키를 Cookie배열로 리턴합니다.

 

request객체의 요청에 사용된 URL/URI 

public String getRequestURI() : 요청에 사용된 URL로부터 URI부분을 문자열로 리턴합니다.  

public String getQueryString():요청에 사용된 쿼리 문자열을 문자열로 리턴합니다..

public String getMethod() : 요청에 사용된 요청방식을 문자열로 리턴합니다.




URL Encoding 특수문자코드

Use this URL Encoding table for special characters:


Character Code Character Code

%26%23169; t %74

® %26%23174; u %75

%E2%84%A2 v %76

backspace %08 w %77

tab %09 x %78

linefeed %0A y %79

creturn %0D z %7A

space %20 { %7B

! %21 | %7C

" %22 } %7D

# %23 ~ %7E

$ %24 %A2

% %25 %A3

& %26 %A5

' %27 | %A6

( %28 § %A7

) %29 %AB

* %2A %AC

+ %2B ? %AD

, %2C º %B0

- %2D ± %B1

. %2E ª %B2

/ %2F , %B4

0 %30 μ %B5

1 %31 %BB

2 %32 ¼ %BC

3 %33 ½ %BD

4 %34 ¿ %BF

5 %35 A` %C0

6 %36 %C1

7 %37 A^ %C2

8 %38 A~ %C3

9 %39 %C4

: %3A %C5

; %3B Æ %C6

< %3C %C7

= %3D E` %C8

> %3E %C9

? %3F E^ %CA

@ %40 %CB

A %41 I` %CC

B %42 %CD

C %43 I^ %CE

D %44 %CF

E %45 Ð %D0

F %46 N~ %D1

G %47 O` %D2

H %48 %D3

I %49 O^ %D4

J %4A O~ %D5

K %4B %D6

L %4C Ø %D8

M %4D U` %D9

N %4E %DA

O %4F U^ %DB

P %50 %DC

Q %51 %DD

R %52 Þ %DE

S %53 ß %DF

T %54 a` %E0

U %55 %E1

V %56 a^ %E2

W %57 a~ %E3

X %58 %E4

Y %59 %E5

Z %5A æ %E6

[ %5B %E7

\ %5C e` %E8

] %5D %E9

^ %5E e^ %EA

_ %5F %EB

` %60 i` %EC

a %61 %ED

b %62 i^ %EE

c %63 %EF

d %64 ð %F0

e %65 n~ %F1

f %66 o` %F2

g %67 %F3

h %68 o^ %F4

i %69 o~ %F5

j %6A %F6

k %6B ÷ %F7

l %6C ø %F8

m %6D u` %F9

n %6E %FA

o %6F u^ %FB

p %70 %FC

q %71 %FD

r %72 þ %FE

s %73 %FF


+ Recent posts