09 November 2008

Menggunakan Session untuk menangani validasi halaman JSP

Dalam aplikasi web, terkadang kita memerlukan UI (User Interface), untuk mengkontrol aplikasi web, terutama aplikasi web yang konfigurasinya memakai database. Pengaturan kontrol aplikasi web yang memakai UI, tentunya tidak bisa sembarangan, artinya hanya user yang diberikan ijin saja yang bisa memakai UI tersebut untuk mengkontrol suatu aplikasi web. Sebab jika semua user bisa memakai UI tsb, maka aplikasi web pun akan menjadi berantakan jika masing-masing user tidak punya kesepahaman.

Perpindahan antar halaman web dalam UI untuk mengkonfigurasi suatu web pastinya harus ada suatu otentifikasi, pendeknya semua halaman UI baru bisa di akses jika otentifikasi user dinyatakan boleh mengakses halaman web yang di request, sehingga semua perubahan pada konfigurasi aplikasi web dapat dipertanggungjawabkan.

Dalam aplikasi web kita kenal cookie dan session sebagai sebuah cara untuk menangani suatu otentikasi ketika mengakses sebuah halaman web. Pada kesempatan kali ini kita akan menggunakan session sebagai sebuah otentikasi akses halaman web. Penggunaan session sebagai otentikasi akses halaman web ini disebut dengan session tracking.

Dalam pemrograman Java, session diatur dalam beberapa kelas yang ada dalam package javax.servlet.http.*, dalam package inilah kita bisa memanajemen session dalam suatu aplikasi web yang kita buat. Untuk mempermudah pemahaman akan manajemen session ini, kita akan mempersempit pembahasan hanya pada attribut session saja. Attribut session ini akan kita pakai sebagai otentikasi akses halaman web. Dalam penanganan session menggunakan attribut, java menyebutnya sebagai Session Bounded-Object, artinya ada sembarang objek java yang dipakai untuk mengeset attribut session ataupun menghancurkan attribute session. Objek ini terikat pada suatu session, sehingga kita bisa menggunakannya sebagai otentikasi akses halaman web.

Kita langsung saja pada contoh.

Kali ini kita akan membuat sebuah aplikasi web dimana aplikasi tersebut menggunakan login untuk bisa mengakses ke semua halaman yang ada pada aplikasi web kita. Karena pembahasan kali ini ke arah session tracking, maka kita hanya akan menekankan penggunaan attribut session pada aplikasi web kita kali ini.

Dibawah ini adalah plan/bussines flow project kita :

  1. User login menggunakan username dan password untuk mengakses aplikasi web.

  2. Jika username dan password benar, attribut session akan di set pada session yang ada. Kemudian user akan dilempar kehalaman utama.

  3. Setiap halaman yang akan diakses oleh user harus divalidasi oleh session, jika ada user yang mencoba mengakses sebuah halaman tanpa validasi, maka user akan langsung dilempar ke halaman login.

  4. Jika user ingin keluar dari session yang ada, user bisa mengakses sebuah halaman dimana didalam halaman tsb, session yang dipegang oleh aplikasi web, dihancurkan.

Untuk mendukung business flow project ini kita akan membuat beberapa file, yaitu:

File WebAccount.java, file ini adalah file obyek java yang nantinya akan kita pakai sebagai obyek yang menyertai session. Atau objek ini akan kita pakai sebagai sebuah objeck yang nantinya akan diikat oleh session dan kemudian dihancurkan ketika user melakukan logout. Karena ini sebuah percobaan, kita akan membuat username dan password yang statis, artinya kita definisikan langsung didalam kelas, untuk pengembangan selanjutanya kita bisa mengambil nilai username dan password bisa dari database, property file dan lain-lain.

File WebSession.javafile ini adalah sebuah kelas yang kita buat sebagai sebuah cara untuk mengikat atau melepaskan ikatan sebuah obyek terhadap session yang ada, oleh karena obyek yang akan kita pakai adalah obyek buatan kita sendiri, maka kita membuat kelas ini dengan meng-implements kelas dari HttpSessionBindingListener. Dalam kelas ini kita juga hanya akan membuat dua method yang merupakan implement dari kelas HttpSessionBindingListener, yang berguna untuk melacak apakah attribut session sudah terpasang atau dihancurkan. Methode tsb adalah valueBond, dan valueUnbound, dalam pengembangan lebih lanjut kita bisa menggunakan dua method ini sebagai penyimpanan session dalam database, baik ketika user login maupun ketika user logout, sehingga user yang login dan logout bisa diketahui siapa dan kapan dia beraktifitas dalam aplikasi web kita.

File index.jspfile ini adalah sebuah halaman form html yang berisi dua input yaitu username dan password dan sebuah tombol submit yang ketika tombol submit itu ditekan, maka form akan memposting username dan password yang diinputkan user ke halaman validate.jsp

File validate.jspfile inilah yang akan mengecek apakah username dan password sudah benar sesuai dengan nilai yang terdapat pada kelas WebAccount. File ini akan melempar user ke halaman tertentu tergantung pada benar tidaknya username dan password yang dimasukkan.

File loginfail.jspfile inilah yang akan menangani jika username atau password salah, pada prosesnya file ini akan kembali melempar user ke halaman index.jsp dimana halaman index.jsp berisi form login.

File main.jspfile ini adalah sebuah file yang akan bisa dimasuki atau di akses oleh user jika validasi session untuk user tsb benar. Dalam file ini, session akan diperiksa, jika attribute dari session tsb ada maka akan ditampilkan suatu halaman yang berisi welcome , namun jika session tsb tidak ada maka user akan dilempar ke halaman login.

File logout.jspfile ini adalah sebuah file yang berisi kode untuk menghancurkan session yang ada sehingga user yang terikat pada session sebelumnya tidak terikat lagi.

Demikian file-file yang kita buat untuk bisa lebih memahami penggunaan session dalam validasi akses user ke halaman-halaman yang diakses. Untuk penjelasannya kita hanya akan membahas beberapa file saja dari file yang ada diatas yang menjadi bagian penting dari pembahasan session-tracking ini. File pertama yang kita bahas adalah file WebSession.java. perhatikan kode didalam file ini.

package org.mojo.web.util;

import org.mojo.web.model.WebAccount;

import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
* Created by IntelliJ IDEA.
* User: Mojo
* Date: 09 Nov 08
* Time: 0:17:10
* To change this template use File | Settings | File Templates.
*/
public class WebSession implements HttpSessionBindingListener {
private WebAccount account;
private String remoteAddress;

public WebSession(WebAccount account, String remoteAddress) {
System.out.println("WebSession Instantiated...");
this.account = account;
this.remoteAddress = remoteAddress;
}

public void valueBound(HttpSessionBindingEvent event) {
System.out.println("New WebSession created: " + remoteAddress + "/" + account);
}

public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("WebSession Destryoyed");
}

public WebAccount getWebAccount() {
return account;
}
}

Pada kode, diatas variabel account didefinisikan sebagai sebuah obyek WebAccount, kemudian konstruktor dari WebSession tsb didefinisikan dengan mengikutsertakan obyek account dan String remoteAddress sebagai parameternya. Pada dasarnya ketika konstruktor obyek ini dipanggil maka obyek WebSession ini akan mengikat obyek  account, sehingga untuk kemudian ketika attribute session di set, maka obyek  account ini akan terpasang sebagai sebuah obyek session. Namun yang harus diperhatikan adalah sebelum attribut session di set, obyek ini belum terikat ke sessionnya. Ketika attribut session di set dengan menggunakan perintah session.setAttribut(<String Penanda>,<SembarangObjeckJava>); maka baris method public void valueBound(HttpSessionBindingEvent event) terpanggil secara otomatis. Lantas kapan method public void valueUnbound(HttpSessionBindingEvent event) dipanggil? Method ini akan dipanggil secara otomatis pula ketika session di hancurkan, atau waktu session yang di set sudah habis.

File kedua yang akan kita bahas adalah file validate.jsp. Dalam file ini ada konsep penting yang harus kita perhatikan. Silahkan lihat barisan potongan kode yang kita ambil dari validate.jsp ini:

String URLtoDisplay    ="";
String username = request.getParameter("username").trim();
String password = request.getParameter("password").trim();
if (username.equals(null) || password.equals(null)) {
request.sendRedirect("index.jsp");
}

WebAccount wa = new WebAccount();

//validating account
if(username.equals(wa.getUserName()) && password.equals(wa.getPassword())){
session.setMaxInactiveInterval( 900 );
URLtoDisplay = "main.jsp";
WebSession ws = new WebSession( wa, request.getRemoteAddr());
session.setAttribute( "onlineUser", ws );
}else {
URLtoDisplay = "loginfail.jsp";
}

request.sendRedirect(URLtoDisplay);

Pada baris kode tsb diatas kita bisa melihat variabel username dan password diambil dari parameter yang dilempar oleh form login. Kemudian ada statement branching dengan pernyataan bila username dan password adalah null maka user akan dilempar kembali ke halaman login. Jika username dan passwordnya ada maka akan kembali diprosess pada statement branching, namun pada branching yang kedua ini kita bisa melihat ada pointing ke halaman tertentu tergantung pada syarat yang masuk dalam proses tsb.

Sebelum branching ke dua kita bisa melihat bahwa ada pemanggilan obyek WebAccount disana, dimana untuk kasus ini username dan password yang ada pada WebAccount kita hardcode. Setelah itu kita bisa melihat bahwa ada proses pencabangan yang memeriksa variabel username dan password apakah sama dengan username dan password yang diperoleh dari obyek WebAccount. Perhatikan diatas jika username dan password yang diinputkan, sama dengan nilai username dan password yang ada pada obyek WebAccount, maka disana akan dimulai setting attribut session. Setting attribut session yang pertama adalah setting waktu session seperti terlihat pada kode:

session.setMaxInactiveInterval( 900 );

Baris ini memerintahkan aplikasi untuk men-setting session selama 900 detik atau sekitar 15 menit. Artinya jika tidak ada aktifitas user selama waktu 900 detik, maka secara otomatis session akan dihancurkan, dan user harus login kembali untuk bisa mengakses halaman-halaman yang diinginkan pada aplikasi web kita. Kemudian baris berikutnya adalah:

URLtoDisplay = “main.jsp”;

Baris ini menyatakan bahwa variabel URLtoDisplay di isi dengan nilai main.jsp, yang nantinya akan berguna untuk melempar user ke halaman main.jsp jika attribut session telah berhasil di set.

Setelah itu baris berikutnya memanggil konstruktor WebSession yang berguna untuk mengikat obyek WebAccount ke pada obyek WebSession. Seperti baris berikut ini:

WebSession ws = new WebSession( wa, request.getRemoteAddr());

Setelah WebAccount terikat pada obyek WebSession, maka langkah selanjutnya adalah mengikat obyek WebSession ini kedalam attribut session. Dengan baris kode seperti dibawah ini:

session.setAttribute( "onlineUser", ws );

perhatikan bahwa kita mengikat obyek WebSession dengan ID sebuah string yaitu onlineUser, ID inilah yang nantinya akan menjadi titik validasi attribut session pada halaman-halaman berikutnya.

Setelah peryataan else pada branching ke dua kita melihat ada sebuah fungsi jsp yang berguna melempar user ke halaman yang memang sudah di set didalam variabel URLtoDisplay.

Sampai disini kita sudah menyelesaikan algoritma form login sampai dengan validasinya. Tinggal bagaimana kita menggunakan session-tracking, dan algoritma menghancurkan session ketika user melakukan logout.

Untuk kode menghancurkan session kita bisa langsung melihat halaman logout.jsp, karena memang sedemikian mudah menghancurkan session yang ada. Sekarang kita akan membahas bagaimana session-tracking ini di pakai pada halaman-halaman selanjutnya.

Sebagai bahan pembahasan mari kita lihat kode pada halaman main.jsp dimana selanjutnya untuk membuat halaman lain yang dapat memeriksa session yang ada kita bisa meng – copy paste saja kode utama dari pemeriksaan session ini. Perhatikan potongan kode pada halaman main.jsp di bawah ini :

    WebSession ws    = (WebSession)session.getAttribute ("onlineUser");
WebAccount acc = null;
if( ws != null ) {
acc = ws.getWebAccount();
}
if (acc == null) {
response.sendRedirect(“logout.jsp”);
}


Pada code diatas kita dapat melihat bahwa pemeriksaan session di lakukan dengan cara menginisialisasi WebSession dengan mengambil nilai dari session yang ada. Kode :

WebSession ws = (WebSession)session.getAttribute ("onlineUser");

Kemudian obyek WebSession diperiksa, jika isi dari WebSession tidak sama dengan null maka obyek Account akan diambil dari obyek WebSession untuk diproses selanjutnya, karena dalam obyek WebAccount ada suatu method yang mengambil nilai-nilai dari obyek Account. Kemudian pemeriksaan dilanjutkan dengan cara memeriksa kembali jika obyek Account adalah Null maka user akan dilempar kembali ke halaman login.

Diatas bisa kita lihat bahwa pemeriksaan session hanya dilakukan oleh baris kode yang sedikit sekali sehingga kode diatas bisa copy paste kedalam halaman-halaman lain yang nantinya akan kita buat lagi, algoritmanya pun cukup sederhana, jika user tsb tidak valid maka lempar user ke halaman login, jika valid teruskan baris proses berikutnya, itu saja algoritma yang kita pakai dalam session-tracking kali ini.

Demikianlah pembahasan session-tracking dengan halaman jsp kita kali ini, dengan tulisan ini kita berharap kita dapat lebih memahami session dan penggunaannya sebagai sebuah session-tracking pada aplikasi web.

Ada catatan: jika kita langsung menggunakan file-file contoh yang kita lampirkan dalam tulisan ini, kita harus memperhatikan baris-baris package yang terdapat pada header file seperti yang ada pada file WebAccount.java dan WebSession.java. File-file tsb harus ditempatkan pada package yang benar sesuai dengan yang dideklarasikan pada header file-file tsb. Jika mendownload langsung, harus diperhatikan ekstension yang dipakai pada file tsb. Silahkan dicoba dan dikembangkan.

Semoga bermanfaat

Menteng, 9 November 2008.

Josescalia

4 comments:

Anonymous said...

Pak kalo boleh tanya, gimana caranya untuk mengubah session id sesuai dengan yang kita inginkan? Gimana programnya ya pak? Q bingung soalnya udah lama

agita said...

halo pak..
td aq baca artikelnya, trus ada yg blom ngerti sedikit,
session.setAttribute( "onlineUser", ws );
itu onlineUser sbg atribut apa? bagian dr database ya? maaf ya pak aq masih awam banget ttg jsp ini

Anonymous said...

hallo pak. thanks buat artikelnya, tapi bisa gak source code nya di tampilkan atau dipindahkan ke tempat lain. karena saya buka, tapi geocitiesnya udah ditutup, jadi gak bisa ngambil datanya. thnks

JoseScalia said...

Mohon maaf sebelumnya
untuk file-file yang sudah tidak bisa di download berikut masing-masing Link-nya
1. WebAccount.java ==> http://sites.google.com/site/josescalia/Project/WebAccount.java?attredirects=0&d=1

2. WebSession.java ==> http://sites.google.com/site/josescalia/Project/WebSession.java?attredirects=0&d=1

3. Index.jsp ==> http://sites.google.com/site/josescalia/Project/index.jsp?attredirects=0&d=1

4. Validate.jsp ==> http://sites.google.com/site/josescalia/Project/validate.jsp?attredirects=0&d=1

5. Loginfail.jsp ==> http://sites.google.com/site/josescalia/Project/loginfail.jsp?attredirects=0&d=1

6. Main.jsp ==> http://sites.google.com/site/josescalia/Project/main.jsp?attredirects=0&d=1

7. Logout.jsp ==> http://sites.google.com/site/josescalia/Project/logout.jsp?attredirects=0&d=1

Sekali lagi saya mohon maaf atas kesalahan teknis ini..

Terima kasih telah mengunjungi blog ini


Salam

Josescalia