HTTP session nedir?
HTTP protokolü ve web serverlar stateless olduğundan, state bilgisini tutamazlar.
Yapılan her server-client konuşmasına bir id verilerek, her request ve response bu id ile etiketlenerek, state bilgisinin tutulması, yani serverin client'ı hatırlaması sağlanır.
Bu konuşma bir HTTP session'dır.
Bu işlemin yönetilmesine de HTTP session mangement denir.
HTTP session management yöntemleri
1. Kullanıcı adı ve şifresi kombinasyonunu gönderme
Kullanıcının girdiği kullanıcı adı ve şifre bilgisini sever-client arasındaki her request-response mesajında gidip gelmesidir.Etkili bir yöntem değildir. Çünkü aynı kullanıcı farklı bir tarayıcıdan da giriş yapmak istediğinde işe yaramaz.
2. HTML de gizli alan ekleme
html kodu içerisine gizli bir alan ekleyebiliriz. Bu alanda kullanıcı sayfada gezmeye başladığı andan itibaren unique bir id değeri saklarız.Bu metod linklerle kullanılamaz; çünkü her request yapıldığında tekrardan formun doldurulmasını gerektirir.
Ayrıca html kodundaki gizli alanı başkaları kolayca elde edip session'ı ele geçirebileceğinden, güvenli de değildir.
3. URL rewriting
Her request ve response'a bir session id parametresi ekleyebiliriz. Böylece session id bilgisini tutabiliriz.Bu işlem de çok yorucu olur; çünkü her response gelişinde bu parametreyi takip etmemiz ve başka parametrelerle çakışmadığından emin olmamız gerekir.
4. cookie kullanma
Cookie'ler web server tarafından response header'da gönderilen ve tarayıcıda saklanan verilerdir.Client request göndereceği zaman request header'ına cookie'ye ekler ve bu sayede session takip edilir.
Cookie'lerle session yapılabilir; fakat client cookie'leri kapattığında bu yöntem çalışmayacaktır.
Bütün bu yöntemlerdeki başlıca sorunlar şunlardır:
-Genellikle sadece session id değil, başka bilgiler de tutulmak isteniyor. Bu yöntemlerle bunları yönetmek çok zordur.
-Her birinin çalışmadığı özel durumlar mevcut. Her koşulda çalışmıyorlar.
5. session management API
Java session management API ile diğer yöntemlerin aksine her senaryoda çalışan bir session management yapabiliriz.
Cookie ile session yönetme
Bir çok web uygulaması cookielerle session takibi yapar ya da önceki seçimlerinize göre özelleştirilmiş cevaplar verir.
javax.servlet.http.Cookie classı ile cookie yaratabiliyoruz.
cookie'ye setMaxAge() metodu ile saniye bazında geçerlilik süresi verebiliyoruz.Cookie loginCookie =
new
Cookie(
"user"
,user);
http response mesajına bu cookie'yi eklediğimizde artık verdiğimiz süre boyunca session devam ediyor.loginCookie.setMaxAge(
30
*
60
);
response.addCookie(loginCookie);
...
Örnek bir servlet ile session cookie uygulaması
@WebServlet
(
"/LoginServlet"
)
public
class
LoginServlet
extends
HttpServlet {
private
static
final
long
serialVersionUID = 1L;
private
final
String userID =
"Pankaj"
;
private
final
String password =
"journaldev"
;
protected
void
doPost(HttpServletRequest request,
HttpServletResponse response)
throws
ServletException, IOException {
// get request parameters for userID and password
String user = request.getParameter(
"user"
);
String pwd = request.getParameter(
"pwd"
);
if
(userID.equals(user) && password.equals(pwd)){
Cookie loginCookie =
new
Cookie(
"user"
,user);
//setting cookie to expiry in 30 mins
loginCookie.setMaxAge(
30
*
60
);
response.addCookie(loginCookie);
response.sendRedirect(
"LoginSuccess.jsp"
);
}
else
{
RequestDispatcher rd = getServletContext().getRequestDispatcher(
"/login.html"
);
PrintWriter out= response.getWriter();
out.println(
"<font color=red>Either user name or password is wrong.</font>"
);
rd.include(request, response);
}
}
}
...
Aynı şekilde eğer çıkış yap(logout) linki tıklanırsa, cookie'nin silinmesi gerekiyor.
Cookie'yi direkt olarak silemesek de, süresini 0 yaptığımızda hemen browserdan silinecektir.
Örnek:
@WebServlet
(
"/LogoutServlet"
)
public
class
LogoutServlet
extends
HttpServlet {
private
static
final
long
serialVersionUID = 1L;
protected
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
response.setContentType(
"text/html"
);
Cookie loginCookie =
null
;
Cookie[] cookies = request.getCookies();
if
(cookies !=
null
){
for
(Cookie cookie : cookies){
if
(cookie.getName().equals(
"user"
)){
loginCookie = cookie;
break
;
}
}
}
if
(loginCookie !=
null
){
loginCookie.setMaxAge(
0
);
response.addCookie(loginCookie);
}
response.sendRedirect(
"login.html"
);
}
}
...
Hiç yorum yok:
Yorum Gönder