Latest web development tutorials

서블릿 세션 추적

HTTP는 클라이언트가 임의의 클라이언트 요청이 예약 전에 웹 서버로 별도의 연결 서버는 자동으로 기록하지 않는 열리고마다 클라이언트가 페이지를 검색하는 수단 "무"프로토콜이다.

그러나 웹 클라이언트와 웹 서버 사이의 세션 대화를 유지하는 세 가지 방법이 여전히있다 :

쿠키

웹 서버가 각 웹 클라이언트 세션 쿠키로 고유 세션 ID를 할당 할 수 있으며, 클라이언트에 대한 후속 요청을 수신 한 쿠키를 식별하는 데 사용될 수있다.

많은 브라우저가 쿠키를 지원하지 않기 때문에 이것은 효과적인 방법이 될 수 없습니다, 그래서 우리는 세션 세션을 유지하기 위해이 방법을 사용하지 않는 것이 좋습니다.

숨겨진 양식 필드

다음과 같은 웹 서버는 숨겨진 HTML 양식 필드뿐만 아니라 고유의 세션의 세션 ID를 전송할 수있다 :

<입력 유형 = "숨겨진"이름 = "세션 ID"값 = "12345">

이 항목은 양식이 제출 될 때, 지정된 이름과 값이 자동으로 GET 또는 POST 데이터에 포함된다는 것을 의미합니다. 웹 브라우저의 요청을 다시 송신마다, SESSION_ID 값은 다른 웹 브라우저 추적을 유지하기 위해 사용될 수있다.

이 세션 세션 추적을 유지하는 효과적인 방법이 될 수 있지만, 숨겨진 양식 필드가 일반 세션 세션 추적을 지원하지 않도록, 양식 제출로 이어질하지 않는 기존의 하이퍼 텍스트 링크 (<A HREF...>)를 클릭 할 수 있습니다.

URL 재 작성

사용자는 세션의 세션의 세션의 세션 식별자와 연관된 서버는 세션에 대해서 세션에 저장된 데이터를 식별하는 URL의 각 단부에 일부 추가 데이터를 추가 할 수있다.

예를 들어, HTTP : //w3cschool.cc/file.htm, 세션 id = 12345, 세션이 세션 식별자는 세션 id = 12345으로 부착되고, 식별자는 클라이언트를 식별하기 위해 웹 서버에 액세스 할 수있다.

URL 다시 쓰기 브라우저 쿠키를 지원하지 않을 때, 매우 잘 작동 할 수 회의 세션을 유지하기 위해 더 좋은 방법이지만, 그 결점은 동적더라도 세션 페이지 세션 ID를 할당하기 위해 각각의 URL에 대해 생성 된 정적 HTML 페이지도 될 것입니다 매우 간단합니다.

의 HttpSession 객체

상기 세 가지 방법에 더하여, 서블릿은 식별 크로스 이상의 페이지 요청 또는 방식을 방문하는 사용자에 대한 정보를 저장하기 위해 사용자에게 제공 HttpSession에 인터페이스를 제공한다.

서블릿 컨테이너는 HTTP 클라이언트와 HTTP 서버 간의 세션 대화를 생성하기 위해이 인터페이스를 사용한다. 세션은 여러 페이지 요청 또는 연결에서 지정된 시간을 지속한다.

다음과같이는 HttpServletRequest의 공개 방법에 대해 getSession ()를호출하여 HttpSession에 개체를 가져 올 것이다 :

의 HttpSession 세션 = request.getSession ();

클라이언트에 대한 문서 내용을 전송하는() request.getSession를호출하기전에해야합니다.여기에 몇 가지 중요한 메소드의 HttpSession 객체의 사용할 수있는 요약입니다 :

序号方法 & 描述
1public Object getAttribute(String name)
该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。
2public Enumeration getAttributeNames()
该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。
3public long getCreationTime()
该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
4public String getId()
该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。
5public long getLastAccessedTime()
该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。
6public int getMaxInactiveInterval()
该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。
7public void invalidate()
该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。
8public boolean isNew()
如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。
9public void removeAttribute(String name)
该方法将从该 session 会话移除指定名称的对象。
10public void setAttribute(String name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话。
11public void setMaxInactiveInterval(int interval)
该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。

세션 추적 예

이 예는 세션 세션 생성 시간 및 마지막 액세스 시간을 얻기 위해의 HttpSession 객체를 사용하는 방법을 보여줍니다. 어떤 세션의 세션이없는 경우 세션 요청하여 새로운 세션을 생성한다.

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTrack
 */
@WebServlet("/SessionTrack")
public class SessionTrack extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 如果不存在 session 会话,则创建一个 session 对象
		HttpSession session = request.getSession(true);
		// 获取 session 创建时间
		Date createTime = new Date(session.getCreationTime());
		// 获取该网页的最后一次访问时间
		Date lastAccessTime = new Date(session.getLastAccessedTime());
		 
	    //设置日期输出的格式  
	    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	
		String title = "Servlet Session 实例 - 本教程";
		Integer visitCount = new Integer(0);
		String visitCountKey = new String("visitCount");
		String userIDKey = new String("userID");
		String userID = new String("w3big");
	
		// 检查网页上是否有新的访问者
		if (session.isNew()){
			title = "Servlet Session 实例 - 本教程";
		 	session.setAttribute(userIDKey, userID);
		} else {
		 	visitCount = (Integer)session.getAttribute(visitCountKey);
		 	visitCount = visitCount + 1;
		 	userID = (String)session.getAttribute(userIDKey);
		}
		session.setAttribute(visitCountKey,  visitCount);
	
		// 设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
	
		String docType = "<!DOCTYPE html>\n";
		out.println(docType +
		        "<html>\n" +
		        "<head><title>" + title + "</title></head>\n" +
		        "<body bgcolor=\"#f0f0f0\">\n" +
		        "<h1 align=\"center\">" + title + "</h1>\n" +
		         "<h2 align=\"center\">Session 信息</h2>\n" +
		        "<table border=\"1\" align=\"center\">\n" +
		        "<tr bgcolor=\"#949494\">\n" +
		        "  <th>Session 信息</th><th>值</th></tr>\n" +
		        "<tr>\n" +
		        "  <td>id</td>\n" +
		        "  <td>" + session.getId() + "</td></tr>\n" +
		        "<tr>\n" +
		        "  <td>创建时间</td>\n" +
		        "  <td>" +  df.format(createTime) + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>最后访问时间</td>\n" +
		        "  <td>" + df.format(lastAccessTime) + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>用户 ID</td>\n" +
		        "  <td>" + userID + 
		        "  </td></tr>\n" +
		        "<tr>\n" +
		        "  <td>访问统计:</td>\n" +
		        "  <td>" + visitCount + "</td></tr>\n" +
		        "</table>\n" +
		        "</body></html>"); 
	}
}

이전서블릿 SessionTrack를 컴파일하고 web.xml 파일에서 해당 항목을 만들 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 类名 -->  
    <servlet-name>SessionTrack</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.w3big.test.SessionTrack</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>SessionTrack</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/SessionTrack</url-pattern>
  </servlet-mapping>
</web-app>

브라우저의 주소 표시 줄에HTTP를입력: // localhost를 : 8080 / TomcatTest/ SessionTrack, 먼저 쇼를 실행하면 다음과 같은 결과 :

그것은 다음과 같은 결과를 보여줄 것이다, 다시 같은 서블릿을 실행하려고 :


세션 세션 데이터를 삭제

당신이 세션 사용자 세션 데이터를 완료하면, 당신은 다음과 같은 옵션이 있습니다 :

  • 특정 속성을 제거 : 당신은 키와 연관된 특정 값을 제거하기 위해공공 무효 removeAttribute (문자열 이름)메소드를 호출 할 수 있습니다.
  • 전체 세션 세션을 삭제 : 전체 세션 세션을 폐기하기 위해공공 무효 무효 ()메서드를 호출 할 수 있습니다.
  • 세션 설정 세션 만료 시간 : 당신은 별도의 세션 세션 시간 제한을 설정하는공공 무효 setMaxInactiveInterval (INT 간격)메서드를 호출 할 수 있습니다.
  • 로그 아웃 사용자 : 지원되는 서블릿 2.4 서버를 사용하는 경우, 당신은 웹 서버 클라이언트를 로그 아웃 로그 아웃을호출 할 수 있으며, 모든 사용자가 유효하지 않은 모든 세션 세션에 속하는.
  • web.xml의 구성 : Tomcat을 사용하는 경우 다음과 같이 위의 방법 이외에, 당신은 web.xml 파일에서 세션 세션 시간 제한을 구성 할 수 있습니다 :
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>

위의 아웃 시간의 예는 Tomcat이 기본 30 분 타임 아웃을 무시합니다, 분입니다.

() 메소드에서 서블릿에서 getMaxInactiveInterval 초, 타임 아웃 세션 세션을 반환합니다. 그래서 15 분의 web.xml의 세션 시간에 구성된 세션 시간 제한은 다음 getMaxInactiveInterval (가) (900)를 반환합니다.