전통문화대전망 - 전통 미덕 - 세션 이외에 서블릿이 세션 추적에 사용할 수 있는 방법은 무엇입니까?
세션 이외에 서블릿이 세션 추적에 사용할 수 있는 방법은 무엇입니까?
1: 세션 및 세션 추적
Session 은 중국어에서 종종' 회화' 로 번역되는데, 이는 처음부터 끝까지 일련의 동작이나 소식을 뜻하는 것이다. 예를 들어, 전화 걸기에서 전화 끊기까지 일련의 프로세스를 세션이라고 할 수 있습니다. 때로는 "브라우저 세션 중 ..." 이라는 단어를 볼 수 있습니다. 여기서 "세션" 이라는 단어는 브라우저 창이 열려 있는 시점부터 닫혀 있는 시점까지의 의미를 사용합니다. 만약 우리가 "사용자가 대화 중 ..." 이라고 말한다면, 온라인 쇼핑에서 상품 구매부터 결제에 이르기까지 사용자의 일련의 동작을 가리킨다. 그러나, 때때로 그것은 단지 하나의 연결만을 가리키는 것일 수 있다. Session 은 많은 의미를 가지고 있는데, 차이점은 문맥으로만 추론할 수 있다. 세션 추적은 클라이언트와 서버 간의 상태를 유지하는 솔루션입니다. 간단히 말해서, 고객이 여러 페이지 사이를 전환할 때 서버는 사용자의 정보를 저장합니다.
2. 세션 추적을 구현하는 네 가지 방법 세션 추적을 구현하는 네 가지 방법이 있습니다.
(1) 영구 쿠키를 사용합니다.
(2) 추가 매개 변수로 URL 을 다시 작성하십시오.
(3) 데이터가 포함된 숨겨진 양식 필드를 만듭니다.
(4) 내장 세션 객체를 사용합니다.
세션 추적의 처음 세 가지 방법은 전통적이며 각 방법에는 단점이 있습니다. 마지막 방법은 현재 가장 많이 사용되고 가장 효과적인 솔루션이며, 여기서는 네 번째 세션 추적 방법을 중점적으로 다루고 있습니다. 그러나 세션 추적 메커니즘을 완전히 이해하려면 먼저 기존 세션 추적 방법을 소개해야 합니다. (여기 내 이해와는 다르다. 나는 나의 이해를 기록했다. 세션의 메커니즘은 Java 서브렛 사양에 명시되어 있으며, Tomcat 컨테이너는 이를 구현합니다. Tomcat 은 쿠키와 URL 다시 쓰기를 통해 이루어집니다. 즉, 쿠키 또는 URL 재작성을 통해 세션 ID 를 저장하여 Tomcat 가 내부적으로 이 세션 ID 를 맵과 연결하여 변수와 세션을 연결할 수 있도록 하는 것입니다. 따라서 첫 번째와 두 번째 방법은 Tomcat 또는 다른 서블릿 컨테이너가 세션 메커니즘을 구현하는 수단이지만 직접 구현할 수도 있습니다. 세 번째 방법은 두 페이지가 점프할 때 변수를 전달하는 한 가지 방법일 뿐입니다. 이런 방식으로 회화 메커니즘을 실현하는 것은 비현실적이다. 각 페이지에 숨겨진 데이터와 전달할 모든 변수를 적어야 합니다. ) 을 참조하십시오
2. 1: 쿠키 사용
쿠키는 이 텍스트 파일의 세션 정보를 기록하는 작은 텍스트 파일이며, 각 페이지는 쿠키에서 이전 세션 정보를 추출합니다. 예를 들면 다음과 같습니다.
Stringsessionid = makeuniquestring ();
Hashmapsessioninfo = newhashmap ();
Hashmapglobaltable = findtablestoringsessions ();
GlobalTable.put(sessionID, 세션 정보);
쿠키 세션 쿠키 = new 쿠키 ("jsessionid", 세션 id);
Sessioncookie.setpath ("/");
Response.add 쿠키 (세션 쿠키);
앞의 코드는 먼저 HashMap 에 세션 정보를 기록하고 서버측에 저장하여 세션 ID 로 식별한 다음 세션 ID 를 "JS 세션 ID" 라는 쿠키에 저장합니다.
쿠키 [] 쿠키 = request.getcookies ();
String sessionid = null
HashMap sessionInfo = null
Hashmapglobaltable = findtablestoringsessions ();
만약! =null){
For(int I = 0;; 나 & ltcookies.lengthi++){
If (쿠키 [I]. GetName () 을 참조하십시오. 같음 ("jsessionid") {
세션 id = 쿠키 [I]. Getvalue ();
깨뜨리다
}
}
If (세션 id! =null){
Sessioninfo = globaltable.get (세션 id);
//세션 정보를 사용하여 원하는 값을 얻을 수 있습니다
}
}
사용자의 요청이 서버에 도착하면 먼저 쿠키에서 세션 id 를 추출한 다음 HashMap 에서 세션 정보를 추출합니다. 따라서 세션 추적이 가능합니다.
쿠키는 강력하고 지속적이지만 일부 사용자는 쿠키의 개인 정보 보호에 대한 위협에 대한 두려움 때문에 쿠키를 닫습니다. 이런 상황이 발생하면 쿠키를 사용하여 세션 추적 기능을 구현할 수 없습니다.
2.2:URL 재작성
URL 재작성은 GET 메서드를 사용하여 URL 끝에 추가 매개변수를 추가하여 세션 추적을 수행하는 것입니다. 서버는 이 식별자를 세션에 대해 저장된 데이터와 연관시킵니다. URL 은 다음과 같습니다.
Http://host/path/file.html : Jsessionid= 1234,
URL 재작성 사용의 장점은 쿠키가 비활성화되거나 전혀 지원되지 않을 때 여전히 작동할 수 있다는 것입니다. 하지만 많은 단점이 있습니다.
1. 귀하의 사이트를 가리키는 모든 URL 은 인코딩해야 합니다.
2. 모든 페이지는 동적으로 생성되어야 합니다.
3. 사전 녹음된 웹 주소를 사용하거나 다른 웹 사이트 링크에서 액세스할 수 없습니다.
2.3: 양식 필드 숨기기
양식 필드를 숨기는 방법은 HTML 의 hidden 속성을 사용하여 사용자가 알지 못하는 경우 클라이언트 정보를 서버로 몰래 전송하여 요청과 함께 처리하여 세션 추적 작업을 수행하는 것입니다. 다음과 같은 방법으로 숨겨진 양식 필드에 대한 세션 추적을 수행할 수 있습니다.
& lt input type = "hidden" name = "userid" value = "15" >
그런 다음 필드를 숨겨 중요한 사용자 정보 (예: ID 등 고유한 데이터) 를 서버로 전송합니다. 숨겨진 필드의 장점은 세션 데이터가 서버로 전송될 때 GET 메서드와는 달리 세션 데이터가 URL 에 공개된다는 것입니다. 그러나 세션 데이터가 숨겨진 필드에 저장되면 사용자가 HTML 의 소스 파일을 직접 볼 때마다 세션 데이터가 노출되므로 데이터가 노출될 위험이 있다는 단점이 있습니다. 이로 인해 보안 취약점이 발생할 수 있습니다. 특히 사용자 ID 와 비밀번호에 의존하여 사용자 데이터를 획득하면 도난될 위험이 있습니다. 또한 이 방법은 특정 프로세스에만 적용되며 일반적인 세션 추적에는 적합하지 않습니다.
2.4: 내장 세션 객체 사용
전통적인 세션 추적 방법은 사용하기가 번거롭지만 서블릿의 세션 메커니즘은 쿠키 또는 URL 다시 쓰기 기술을 기반으로 두 기술의 장점을 결합한 것입니다. 클라이언트가 쿠키를 허용할 때 내장 세션 객체는 세션 추적에 쿠키를 사용합니다. 클라이언트가 쿠키를 비활성화한 경우 URL 을 사용하여 다시 쓰기를 선택합니다.
(1) 세션 객체를 가져옵니다. 예를 들어 카트를 세션에 속성으로 저장하고 세션을 통해 다른 JSP 페이지에서 카트를 가져올 수 있습니다.
//session 은 JSP 페이지에서 직접 사용할 수 있습니다.
Shoppingcartcart = (shoppingcart) session.getattribute ("cart");
내장 세션 객체는 javax 의 인스턴스입니다. Servlet.http.HttpSession 클래스. JavaBean 또는 서블릿에서 세션을 사용하는 경우 먼저 현재 요청 객체에서 세션을 가져와야 합니다. 예를 들면 다음과 같습니다.
//사용자 세션 및 장바구니를 가져옵니다.
Httpsessionsession = request.getsession ();
Shoppingcartcart = (shoppingcart) session.getattribute ("cart");
(2) 세션의 데이터를 읽고, setAttribute 메서드를 사용하여 세션의 객체를 저장하고, getAttribute 메서드를 통해 객체를 읽습니다. 세션에서 반환된 값은 적절한 유형으로 변환되어야 하며 결과가 비어 있는지 확인해야 합니다. 예를 들어, 다음 코드는 :
Httpsessionsession = request.getsession ();
Someclassvalue = (someclass) session.getattribute ("someid");
If (값 = = null) {
Value = 새로운 SomeClass (...);
Session.setAttribute("someID ",value);
}
DoSomethingWith (값);
(3) 세션 데이터 삭제 removeAttribute 를 호출하여 세션의 값을 삭제합니다. 즉, 이름과 연관된 값을 삭제합니다.
Invalidate 를 호출하여 전체 세션, 즉 현재 세션을 취소합니다.
사용자가 로그아웃하여 사이트를 떠나는 경우 해당 사용자와 관련된 모든 세션을 신중하게 폐기해야 합니다.
(4) 세션의 수명 주기 HTTP 클라이언트에 더 이상 세션이 필요하지 않은지 알 수 없기 때문에 각 세션은 리소스를 재활용할 수 있도록 시간 제한과 연결됩니다. Setmaxinactiveinterval (int secondstolive)
(5) 서버가 세션을 사용할 때 기본적으로 쿠키 기술을 사용하여 세션을 추적합니다. 일반적으로 세션 관리는 서버가 세션 ID 를 사용자의 웹 브라우저에 쿠키로 저장하고 이를 사용하여 각 사용자의 세션을 고유하게 식별하는 것을 의미합니다. 클라이언트가 쿠키를 수락하지 않을 경우 서버는 URL 재작성을 사용하여 세션 id 를 URL 에 매개 변수로 추가하여 세션 관리를 수행할 수 있습니다.
Forward, redirect 에서는 다음 두 가지 메서드를 호출하여 세션을 유효하게 유지해야 합니다 (호출하지 않으면 세션 id 가 전달되지 않았기 때문에 새 페이지에 도달할 때 세션이 유효하지 않게 됩니다).
서브렛의 인터페이스 HttpServletResponse 는 response.encodeURL () 또는 response.encodeRedirectURL () 의 두 가지 메서드를 지정합니다. 두 방법 모두 먼저 브라우저가 쿠키를 지원하는지 여부를 결정합니다. 지원되는 경우 매개 변수 URL 이 있는 그대로 반환되고 세션 ID 가 쿠키를 통해 유지됩니다. 그렇지 않으면 세션 id 가 있는 URL 을 반환합니다. Tomcat 서버는 이 두 가지 방법을 모두 구현합니다.
다음은 encodeURL 메소드를 사용하는 예입니다. 두 파일인 hello 1.jsp 와 hello2.jsp 입니다.
A: hello 1.jsp 전체 프로그램 코드는 다음과 같습니다.
& lt%@ 페이지 contenttype = "text/html; Charset=gb23 12"% >
& lt% stringurl = response.encode URL ("hello2.jsp"); %>
& LTA href ='<% = URL% & gt'& gt hello2.jsp 로 이동
나: 설명:
Hello 1.jsp 는 응답 객체의 encodeURL 메소드를 사용하여 URL 을 인코딩합니다. 여기서 코딩은 요점이 아닙니다. 요점은 브라우저의 쿠키가 비활성화되면 그렇게 된다는 것입니다. Jssessionid = a09f3a5583825ee787580106 ccc62a1E8 과 같은 문자열이 hello2.jsp 뒤에 추가되어 다음 페이지 세션에 대한 정보를 알려줍니다.
B: 리디렉션을 사용합니다. 예를 들면 다음과 같습니다.
Response.sendredirect ("hello2.jsp"); 또한 response.sendredirect (response.encoderredirection ("hello2.jsp")); 또한 세션 ID 가 URL 로 인코딩되면 각 페이지를 인코딩하여 세션 ID 를 저장해야 합니다. 인코딩되지 않은 URL 이 나타나면 세션을 추적할 수 없습니다.
C:hello2.jsp 전체 프로그램 코드는 다음과 같습니다.
& lt%@ 페이지 contenttype = "text/html; Charset=gb23 12"% >
& lt% out.println ("세션 id is"+세션.getid ()); %>
D: 서버가 URL 을 사용하여 재작성하면 다음과 같이 세션 정보가 URL 에 추가되는 것을 볼 수 있습니다.
Http://localhost: 8080/ch09/hello2.jsp; Jsessionid = a09f3a5583825ee787580106 cc62a1E8
E:URL 재작성은 기본적으로 URL 연결에 매개 변수를 추가하고 세션 ID 를 연결에 값으로 포함시켜 응용 프로그램 서버가 세션 ID 를 기준으로 캐시에서 세션을 검색할 수 있도록 합니다.
TOMCAT 서버
세션 추적은 일반적으로 쿠키 및 URL 재작성을 통해 수행됩니다. 브라우저에서 쿠키를 금지하지 않으면 Tomcat 은 먼저 쿠키를 사용합니다. 그렇지 않으면 URL 재작성을 사용하여 세션을 지원합니다.
URL 이 다시 쓴 중복 데이터는 서버가 자동으로 추가한 것인데, 서버는 어떻게 추가됩니까? Tomcat 이 응답을 반환하면 JSP 페이지의 모든 URL (모든 링크 및 양식의 Action 속성 포함) 을 확인하고 "; Jsessionid=xxxxxx. URL 접미어를 추가하는 코드 조각은 다음과 같습니다.
Org.apache.coyote.tomcat5.coyoteresponse 클래스의 toEncoded () 메서드는 URL 재작성을 지원합니다.
1stringbuffer sb = new string buffer (path);
2 if (sb.length () >; 0) {// jsessionid 는 첫 번째가 될 수 없습니다.
3 sb. 추가 ("; Jsessionid = ");
4sb.append (세션 id);
5}
6 sb.append (앵커);
7 sb.append (조회);
8return (sb.tostring ());