Servlet & JSP – 15 – Session – 02

Merhaba Arkadaslar,
Bir onceki yazida Session , Session ID kavramlarindan  ve bu Session ID’nin nasil kullanildigindan bahsettim. Basit bir uygulama yaptik.

Session ID‘nin ,Cookie uzerinden tasindigindan bahsetmistim. Peki , tarayicimizda Cookie ozelligini kapatirsak ?

URL rewriting & URL Encoding

Teknik olarak URL rewriting ile URL encoding farkli anlamlara gelmektedir. URL rewriting , tarayicinin Cookie ozelligi disable/kapali oldugu durumda session bilgisinin tutmak icin kullanilan tekniktir.

URL encoding ise bazi ozel karakterleri ilgili karakter setine uygun donusturme islemidir.

Servlet konusunda URL encoding ile URL rewriting kavramlari arasinda karisikliga neden olan durum ; URL rewriting icin encodeURL metodunun kullanilmasidir. Bu metot aslinda URL rewriting islemini yapmaktadir.

Oncelikle basit bir URL encoding ornegi yapalim;

EncodeURL.java

package _09_HttpSession.urlrewrite;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class EncodeURL {

	public static void main(String[] args) throws UnsupportedEncodingException {
		String str ="<!@#$levent erguder>";
		String encoded=URLEncoder.encode(str,"UTF-8");	
		System.out.println("encoded:"+encoded);

		String decoded=URLDecoder.decode(encoded,"UTF-8");
		System.out.println("decoded:"+decoded);

	}
}

Ornegimizi calistirdigimizda;

encoded:%3C%21%40%23%24levent+erguder%3E
decoded:<!@#$levent erguder>

Burada asil amacimiz URL rewriting konusunu anlamak , biz tekrar Cookie ve Session konusuna geri donelim.

Eger tarayicinin Cookie ozelligi kapaliysa/disable bu durumda Session tutamayiz. Bu durumu gozden kacirmamak ve onlem almak gerekir.

URL rewriting, Cookie ile Session ID alisverisi yapilamadiginda ve encodeURL metodu kullanildiginda calisacaktir.

URL adresleri encode yapildiginda oncelikle Cookie ile Session ID’ye ulasmayi deneyecektir , basarisiz olduktan sonra URL rewriting yapilacaktir.

Ornek Uygulama

Yeni bir paket ve 2 servlet sinifi olusturalim;
_09_HttpSession.urlrewrite
URLRewrite.java
GetSession.java

URLRewrite.java

package _09_HttpSession.urlrewrite;

import java.io.IOException;
import java.io.PrintWriter;

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;

public class URLRewrite extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html");

		HttpSession session = req.getSession();
		session.setAttribute("name", "levent");
                //setAttribute metodu encodeURL metodundan once kullanilmalidir.

		PrintWriter out = resp.getWriter();
		String nonEncodedUrl = "getsession";
		String encodedUrl = resp.encodeURL("getsession");
		// relative adresimizi

		out.println("<html>");
		out.println("<head>");
		out.println("<title>URL Rewriter</title>");
		out.println("</head>");
		out.println("<body>");
		//out.println("Giris - <a href=\"" + nonEncodedUrl + "\"> Click Here</a>.");
		out.println("Giris - <a href=\"" + encodedUrl + "\"> Click Here</a>.");
		// link'ler HTTP GET olarak calisir.
		out.println("</body>");
		out.println("</html>");

	}

}

Onceki yazilarda attribute kavramindan bahsetmistim ve hatirlayacagimiz gibi Attribute scope/yasam dongusu sunlardi ; context,session ve request .

Onceki yazida getSession metodunu incelemistik;

HttpSession session = req.getSession();

session scope/yasam alanimiza “name” isminde attribute ekledik.

GetSession.java

package _09_HttpSession.urlrewrite;

import java.io.IOException;
import java.io.PrintWriter;

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;

public class GetSession extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		HttpSession session = req.getSession();
		String name = (String) session.getAttribute("name");

		PrintWriter pw = resp.getWriter();
		pw.print("Hosgeldin, "+name);
	}

}

Ekledigimiz session attribute degerimize ulastik.

URLrewrite servlet sinifimizi calistiralim ;

urlrewrite

“click here” ile diger servlet sinifimiza gidelim ;

get session

ornegimiz bekledigimiz gibi calisti. Simdi tarayicimizin Cookie ozelligini kapatalim ve tekrar deneyelim.

Session ID bilgisini , Cookie uzerinden tasidigimiz icin Session ID bilgisine yani session’a dolayisiyla session attribute’e ulasamadik ve null deger dondu.

disabled cookie

Bu sorunu cozmek icin HttpServletResponse arabiriminde bulunan encodeURL metodu nu kullanabiliriz.

public String encodeURL(String url);

URLRewrite sinifimizda yorum satiri yaptigimiz su satiri kullanalim ;

String encodedUrl = resp.encodeURL(contextPath + "/getsession");

Tekrar calistirdigimizda, tarayicimizin Cookie ozelligi disable/kapali olmasina ragmen yine de session’a ekledigimiz attribute’e ulasabiliriz.

Ornek Uygulama – 2

encodeRedirectURL metodu belirtilen URL adresini sendRedirect metodu icin encoding islemi yapar. Eger encoding gerekli degilse(Cookie’ler aktif se) URL adresi aynen degismeden doner.

Browser cookileri desteklemediginde(Cookiler kapali oldugunda) sendRedirect metodunda kullanilan tum URL adresleri encodeRedirectURL metodunu kullanmalidir.

sendRedirect metodunda kullanilacak url adresi encoding yapilacagi zaman encodeURL metodu yerine encodeRedirectURL adresi kullanilmalidir.

URLRewriteSendRedirect.java

package _09_HttpSession.encoderedirect;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class URLRewriteSendRedirect extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String encodedRedirectURL =resp.encodeRedirectURL("encodeRedirectME.html");
		
		resp.sendRedirect(encodedRedirectURL);

		// encodeRedirectURL metodu belirtilen URL adresini sendRedirect metodu
		// icin encoding islemi yapar. Eger encoding gerekli degilse(Cookie'ler
		// aktif se)
		// URL adresi aynen degismeden doner.
		//
		// Browser cookileri desteklemediginde(Cookiler kapali oldugunda)
		// sendRedirect metodunda kullanilan tum URL adresleri encodeRedirectURL
		// metodunu kullanmalidir.
		//
		// sendRedirect metodunda kullanilacak url adresi encoding yapilacagi
		// zaman encodeURL metodu yerine encodeRedirectURL adresi
		// kullanilmalidir.

		
	}
}

web.xml dosyamiza servlet tanimini ekleyelim ;

 <servlet>
     <servlet-name>URLRewriteSendRedirect</servlet-name>
     <servlet-class>_09_HttpSession.encoderedirect.URLRewriteSendRedirect</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>URLRewriteSendRedirect</servlet-name>
     <url-pattern>/urlrewritesendredirect</url-pattern>
 </servlet-mapping>

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *