Merhabalar arkadaşlar. Bu yazı içerisinde sizlerle JSF içinde Çerez ( Cookie ) kullanımını öğreneceğiz.
Çerezler intenette gezinirken bir takım bilgileri barındıran, tarayıcımız tarafından bilgiyarımızda tutulan metin dosyalarıdır. Bu bilgiler kullanıcı adı,şifre olabilir ya da alışveriş sitelerindeki sepetlerimiz olabilir. Bugün çok sayıdaki web sitesi çerezleri kullanmaktadır. Tarayıcınızdan çerezlere baktığınızda çok sayıda çerezin kaydedilmiş olduğunu göreceksiniz.
Şimdi biz de bir örnek yaparak çerezin nasıl oluşturulduğunu ve nasıl okunduğunu göreceğiz. Bu yazdaki kodlara şuradan ulaşabilirsiniz. Örneğimiz alış veriş sepeti mantığına benzer olacak. Şimdi örneğimizi inceleyelim.
CookieBean.java
/** * Created by ilkaygunel on 17/09/15. */ import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.servlet.Servlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @ManagedBean @SessionScoped public class CookieBean { List<String> people; List<String> addedPeople; @PostConstruct public void init() { addedPeople=new ArrayList<>(); people=new ArrayList<>(); people.add("Akın Kaldıroğlu"); people.add("Özcan Acar"); people.add("Çağatay Çivici"); people.add("Melih Sakarya"); } public void addToList(String person) throws UnsupportedEncodingException { addedPeople.add(person); // create cookie Cookie existingCookie=null; HttpServletRequest httpServletRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); Cookie[] cookies = httpServletRequest.getCookies(); if (cookies != null) { for(int i=0; i<cookies.length; i++){ if (cookies[i].getName().equalsIgnoreCase("addedPeopleList")){ existingCookie=cookies[i]; } } } if (existingCookie==null) { HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); Cookie cookie = new Cookie("addedPeopleList", URLEncoder.encode(addedPeople.toString().replace("]","").replace("[",""),"UTF-8")); cookie.setMaxAge(365); cookie.setComment("Kullanıcının Listeye Eklediği Ürünler"); httpServletResponse.addCookie(cookie); } else { HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); existingCookie.setValue(URLEncoder.encode(addedPeople.toString().replace("]", "").replace("[", ""), "UTF-8")); existingCookie.setMaxAge(365); existingCookie.setComment("Kullanıcının Listeye Eklediği Ürünler"); httpServletResponse.addCookie(existingCookie); } } public List<String> getPeople() { return people; } }
CookieBean sınıfımız içinde PostConstruct nostasyonu ile listelerimizi oluşturuyor ve sayfada gösterilecek listeyi dolduruyoruz.
- addToList metodu içerisinde öncelikle JSF sayfasından gönderilen kişiyi listemize ekliyoruz.
- Daha sonra existingCookie adında bir Cookie nesnesi tanımlıyoruz. Bu nesneyi Cookie’nin tarayıcıda olup olmadığına bakmak ve çerezlere eklemek için kullanacağız.
- Akabinde bir HttpServletRequest nesnesini FacesContext’ten o anki isteği getRequest metodu ile alarak tanımlıyoruz .
- HttpServletRequest nesnesinden sonra bir Cookies dizisi tanımlıyoruz ve bu diziye HttpServletRequest interface’nin içindeki getCookies metodundan dönen Cookies dizisini atıyoruz.
- Elde ettiğimiz Cookies dizisinin null olup olmama durumuna göre bir for döngüsü döndürüyoruz ve bizim istediğimiz isimdeki bir çerezin tarayıcda olup olmadığına bakıyoruz. Eğer varsa existingCookie değişkenine bu çerezi atıyoruz.
- Akabinde bir if-else yapısı ile existingCookie’nin hala null olup olmadığına bakıyoruz. Önceki if’den null dönmüş olabilir çünki.
- Eğer existingCookie halen null ise yine FacesContext içinden bir HttpServletResponse nesnesi tanımlıyoruz. Cookie sınıfından bir nesne türetip bu sınıfın yapılandırıcısına 2 parametre veriyoruz. Birinci parametrede çerezin ismini söylüyoruz, ikinci parametrede de çerezin tutacağı değeri söylüyoruz. İkinci parametreyi yazarken iş biraz sıkıntı gördüğünüz gibi. Öncelikle listeyi toString ile String’e çeviriyoruz çünki Cookie sınıfı yapılandırıcısı sadece String’leri parametre olarak kabul ediyor. Ardından String’e çevirilmiş listeyi kodluyoruz çünkü çerez yapısı İngilizce karakter dışındaki karakterler için kodlama zorunluluğu getiriyor. Bu zorunluluğu biz de URLEncode sınıfı ile çözüyoruz. Bu sırada liste String’e çevirildiği için başına ve sonuna [ ve ] karakterleri geliyor. Onları silmek ya da silmemek size kalmış. Ben silmeyi tercih ettim.
- Cookie nesnesinin setMaxAge metodu ile çerezin ne kadar zaman saklanacağını bildiyirouz. Bu örnekte çerez 365 saniye saklanacak. Mesela siz bir gün saklanmasını isterseniz 86400 değerini atamanız gerekecek.
- setComment ile çereze bir yorum koyuyoruz.
- Son olarak HttpServletResponse nesnesinin addCookie metoduna elimizdeki Cookie nesnesini parametre olarak verip kullanıcıya cevap verildiği sırada çerezi tarayıcıya kaydettiriyoruz.
- Eğer bu çerez daha önce oluşturulmuşsa, mevcutsa bu kez çerezin değerini güncellemek için setValue metodunu kullanıyoruz ve parametre olarak yine çereze kaydetmek istediğimiz veriyi veriyoruz.
- Aynı şekilde süresini ve yorumunu atıyoruz. Ardından HttpServletResponse ile çerezi tarayıcıya kaydediyoruz.
CookieReading.java
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; /** * Created by ilkaygunel on 17/09/15. */ @ManagedBean @SessionScoped public class CookieReading { public String getCookieValue() throws UnsupportedEncodingException { String cookieValue=""; HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); Cookie[] cookies = httpServletRequest.getCookies(); if (cookies != null) { for(int i=0; i<cookies.length; i++){ if (cookies[i].getName().equalsIgnoreCase("addedPeopleList")){ cookieValue = cookies[i].getValue(); } } } return URLDecoder.decode(cookieValue,"UTF-8"); } }
CookieReading sınıfı içinde getCookieValue metodu ile az önce yaptığımız işlemi yapıyor, Cookie dizisi elde edip diziyi tarıyor ve bizim çerezimisin değerini getValue metodu ile alıyoruz. Bunu bir değişkene koyuyoruz ve bu değişkeni URLDecoder sınıfını kullanarak decode edip döndürüyoruz çünkü çereze kaydederken UTF-8 ile kodlayıp koymuştuk.
index.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <title>JSF Cookie Kullanımı</title> </h:head> <h:body> <h:form> <h:dataTable value="#{cookieBean.people}" var="beanObject"> <h:column> <f:facet name="header"> İsim </f:facet> <h:outputText value="#{beanObject}"/> </h:column> <h:column> <f:facet name="header"> Listeye Ekle </f:facet> <h:commandButton value="Ekle" action="#{cookieBean.addToList(beanObject)}"/> </h:column> </h:dataTable> </h:form> </h:body> </html>
Index kodumuz içinde Ekle butonu ile tıklanan ismi Java sınıfına geçiriyoruz ve metot da listeye ekliyor.
listingPeople.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <title>Cooki'deki Listeyi Yazdırma</title> </h:head> <h:body> <h:form> <h:outputText value="#{cookieReading.cookieValue}"/> </h:form> </h:body> </html>
ListingItems sayfasında çerezden okunan değeri yazdırıyoruz.
Ekran Çıktısı

Projeyi çalıştırdığımızda bu sayfa bizi karşılıyor. Şimdi örneğin Akın Kaldıroğlu ve Melih Sakarya isimlerine tıklıyorum ve listingPeople sayfasına gidiyorum.

Sayfada çerezden okunan değerler gösterildi. Şimdi tarayıcıdan çıkış yapıp tekrar bu sayfayı açıyorum.

Chrome tarayıcı içinde çerezimiz de bu şekilde yer alıyor. Türkçe olmayan karakterler kodlanarak kaydediliyor.
Bu yazıda da bu kadar arkadaşlar. Çerezin JSF projesinde nasıl kullanıdlığını öğrenmiş olduk. Eğer sizin de şu nasıl olur acaba felan dediğiniz konular olursa yoruma yazar ya da [email protected] adresine mail atarsanız araştırıp bir yazı yazmaya gayret ederim. Başka yazıda görüşmek üzere sağlıcakla kalın.