Servletler - Oturum İzleme
HTTP "durumsuz" bir protokoldür, yani bir istemci bir Web sayfasını her aldığında, istemcinin Web sunucusuna ayrı bir bağlantı açması ve sunucunun otomatik olarak önceki istemci isteğinin kaydını tutmamasıdır.
Yine de web istemcisi ile web sunucusu arasında oturumu sürdürmenin üç yolu vardır -
Kurabiye
Bir web sunucusu, her web istemcisine tanımlama bilgisi olarak benzersiz bir oturum kimliği atayabilir ve istemciden gelen sonraki istekler, alınan tanımlama bilgisi kullanılarak tanınabilir.
Çoğu zaman tarayıcı bir çerezi desteklemediği için bu etkili bir yol olmayabilir, bu nedenle oturumları sürdürmek için bu prosedürü kullanmanızı tavsiye etmem.
Gizli Form Alanları
Bir web sunucusu, aşağıdaki gibi benzersiz bir oturum kimliğiyle birlikte gizli bir HTML form alanı gönderebilir -
<input type = "hidden" name = "sessionid" value = "12345">
Bu giriş, form gönderildiğinde, belirtilen ad ve değerin otomatik olarak GET veya POST verilerine dahil edildiği anlamına gelir. Web tarayıcısı isteği geri gönderdiği her seferinde, farklı web tarayıcılarının izini sürmek için session_id değeri kullanılabilir.
Bu, oturumu takip etmenin etkili bir yolu olabilir, ancak normal (<A HREF...>) hipermetin bağlantısına tıklamak bir form gönderimi ile sonuçlanmaz, bu nedenle gizli form alanları da genel oturum izlemeyi destekleyemez.
URL Yeniden Yazma
Her URL'nin sonuna oturumu tanımlayan bazı ekstra veriler ekleyebilirsiniz ve sunucu bu oturum tanımlayıcısını o oturum hakkında depoladığı verilerle ilişkilendirebilir.
Örneğin, http://tutorialspoint.com/file.htm;sessionid = 12345 ile oturum tanımlayıcısı, istemciyi tanımlamak için web sunucusundan erişilebilen sessionid = 12345 olarak eklenir.
URL yeniden yazma, oturumları sürdürmenin daha iyi bir yoludur ve tarayıcılar çerezleri desteklemediğinde bile çalışır. URL'yi yeniden yazmanın sakıncası, basit bir statik HTML sayfası durumunda bile bir oturum kimliği atamak için her URL'yi dinamik olarak oluşturmanız gerekmesidir.
HttpSession Nesnesi
Yukarıda belirtilen üç yoldan ayrı olarak, sunucu uygulaması, bir kullanıcıyı birden fazla sayfa isteği veya bir Web sitesi ziyareti boyunca tanımlamanın ve o kullanıcıyla ilgili bilgileri depolamanın bir yolunu sağlayan HttpSession Arayüzü sağlar.
Sunucu uygulaması kapsayıcısı, bir HTTP istemcisi ile HTTP sunucusu arasında bir oturum oluşturmak için bu arabirimi kullanır. Oturum, kullanıcıdan birden fazla bağlantı veya sayfa talebi karşısında belirli bir süre boyunca devam eder.
Genel yöntemi çağırarak HttpSession nesnesini alırsınız getSession() HttpServletRequest'in aşağıdaki gibi -
HttpSession session = request.getSession();
İstemciye herhangi bir belge içeriği göndermeden önce request.getSession () öğesini çağırmanız gerekir . HttpSession nesnesi aracılığıyla kullanılabilen önemli yöntemlerin bir özeti:
Sr.No. | Yöntem ve Açıklama |
---|---|
1 | public Object getAttribute(String name) Bu yöntem, bu oturumda belirtilen adla bağlı nesneyi döndürür veya ad altında hiçbir nesne bağlı değilse null döndürür. |
2 | public Enumeration getAttributeNames() Bu yöntem, bu oturuma bağlı tüm nesnelerin adlarını içeren String nesnelerinin Numaralandırılmasını döndürür. |
3 | public long getCreationTime() Bu yöntem, 1 Ocak 1970 GMT gece yarısından bu yana milisaniye cinsinden ölçülen bu oturumun oluşturulduğu zamanı döndürür. |
4 | public String getId() Bu yöntem, bu oturuma atanan benzersiz tanımlayıcıyı içeren bir dize döndürür. |
5 | public long getLastAccessedTime() Bu yöntem, oturumun son erişilen zamanını 1 Ocak 1970 GMT gece yarısından bu yana milisaniye biçiminde döndürür. |
6 | public int getMaxInactiveInterval() Bu yöntem, sunucu uygulaması kapsayıcısının oturumu istemci erişimleri arasında açık tutacağı maksimum zaman aralığını (saniye) döndürür. |
7 | public void invalidate() Bu yöntem, bu oturumu geçersiz kılar ve ona bağlı tüm nesnelerin bağlantısını kaldırır. |
8 | public boolean isNew( İstemci oturumu henüz bilmiyorsa veya oturuma katılmamayı seçerse bu yöntem true döndürür. |
9 | public void removeAttribute(String name) Bu yöntem, belirtilen adla bağlı nesneyi bu oturumdan kaldırır. |
10 | public void setAttribute(String name, Object value) Bu yöntem, belirtilen adı kullanarak bir nesneyi bu oturuma bağlar. |
11 | public void setMaxInactiveInterval(int interval) Bu yöntem, sunucu uygulaması kapsayıcısının bu oturumu geçersiz kılmasından önce istemci istekleri arasındaki süreyi saniye cinsinden belirtir. |
Oturum İzleme Örneği
Bu örnek, bir oturum için oluşturma zamanını ve son erişilen zamanı bulmak için HttpSession nesnesinin nasıl kullanılacağını açıklar. Zaten mevcut değilse, yeni bir oturumu istekle ilişkilendiririz.
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class SessionTrack extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Create a session object if it is already not created.
HttpSession session = request.getSession(true);
// Get session creation time.
Date createTime = new Date(session.getCreationTime());
// Get last access time of this web page.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// Check if this is new comer on your web page.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
} else {
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
}
session.setAttribute(visitCountKey, visitCount);
// Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\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 Infomation</h2>\n" +
"<table border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
" <th>Session info</th><th>value</th>
</tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td>
</tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + createTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessTime + " </td>
</tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userID + " </td>
</tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCount + "</td>
</tr>\n" +
"</table>\n" +
"</body>
</html>"
);
}
}
Yukarıdaki sunucu uygulamasını derleyin SessionTrackve web.xml dosyasında uygun girişi oluşturun. Şimdi http: // localhost: 8080 / SessionTrack çalıştırıldığında, ilk kez çalıştıracağınız zaman aşağıdaki sonucu görüntüleyecektir -
Welcome to my website
Session Infomation
Session info
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
0
Şimdi aynı sunucu uygulamasını ikinci kez çalıştırmayı deneyin, aşağıdaki sonucu gösterecektir.
Welcome Back to my website
Session Infomation
info type
value
id
0AE3EC93FF44E3C525B4351B77ABB2D5
Creation Time
Tue Jun 08 17:26:40 GMT+04:00 2010
Time of Last Access
Tue Jun 08 17:26:40 GMT+04:00 2010
User ID
ABCD
Number of visits
1
Oturum Verilerini Silme
Bir kullanıcının oturum verileriyle işiniz bittiğinde, birkaç seçeneğiniz vardır -
Remove a particular attribute- Belirli bir anahtarla ilişkili değeri silmek için public void removeAttribute (Dize adı) yöntemini çağırabilirsiniz .
Delete the whole session- Tüm bir oturumu iptal etmek için public void invalidate () yöntemini çağırabilirsiniz .
Setting Session timeout- Bir oturum için zaman aşımını ayrı ayrı ayarlamak için genel void setMaxInactiveInterval (int interval) yöntemini çağırabilirsiniz .
Log the user out - Servlet 2.4'ü destekleyen sunucular arayabilirsin logout istemcinin Web sunucusundaki oturumunu kapatmak ve tüm kullanıcılara ait tüm oturumları geçersiz kılmak için.
web.xml Configuration - Tomcat kullanıyorsanız yukarıda belirtilen yöntemlerin dışında oturum zaman aşımını web.xml dosyasında aşağıdaki gibi yapılandırabilirsiniz.
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Zaman aşımı dakika olarak ifade edilir ve Tomcat'te 30 dakika olan varsayılan zaman aşımını geçersiz kılar.
Sunucu uygulamasındaki getMaxInactiveInterval () yöntemi, bu oturum için saniye cinsinden zaman aşımı süresini döndürür. Dolayısıyla, oturumunuz web.xml'de 15 dakika yapılandırılırsa, getMaxInactiveInterval () 900 döndürür.