30 November 2008

Ant – Otomatisasi Development Java

Dalam pemrograman java, kita mengenal ANT (Another Neat Tool). Ant adalah sebuah tool dalam pemrograman java dimana masalah compile, deploy dan packaging, menjadi serba otomatis. Ant dikenal dengan istilah “easy-to-use XML based syntax”. Seperti java, ant juga dapat berjalan cross-platform. Dalam ant kita juga mengenal suatu file yang bernama build.xml. File inilah yang menjadi sentral dari semua otomatisasi development java.

Pada prakteknya, ant dipakai oleh para developer java sebagai alat untuk compile, packaging, dan deployment pasca pembuatan source code selesai. Untuk menggunakan ant anda dapat mendownloadnya di sini.

Kali ini kita akan membahas penggunaan ant sebagai sebuah tool untuk mengotomatisasi development java pasca source code selesai dibuat. Mari kita lihat sebuah contoh sederhana dari sebuah build.xml yang dapat di eksekusi oleh ant.


<project name="Blog" default="compile" >
<target name="prepare">
<mkdir dir="G:\Pribadi\MyProgramming\Java\JavaProject\Blog\output"/>
</target>
<target name="compile" depends="prepared">
<javac srcdir="G:\Pribadi\MyProgramming\Java\JavaProject\Blog\src"
destdir="G:\Pribadi\MyProgramming\Java\JavaProject\Blog\output"/>
</target>
</project>

Diatas adalah sebuah contoh sederhana dari sebuah file build.xml. Dari baris-baris tsb kita dapat melihat ada dua task yang bisa di panggil oleh ant yaitu : prepare dan compile. Pada task prepare kita melihat ada sebuah direktori yang harus dibuat disana dengan perintah mkdir, dimana direktori tsb harus terletak pada path G:\Pribadi\MyProgramming\Java\JavaProject\Blog dan direktori tsb bernama output. Sementara pada task compile, kita bisa melihat bahwa task ini bergantung pada task sebelumnya yaitu task “prepare”, artinya jika task prepare gagal di eksekusi maka task compile pun tidak akan dieksekusi oleh ant itu sendiri. Dalam task compile, kita juga dapat melihat bahwa fungsi utama dari task tsb adalah mengkompilasi semua source code yang ada pada direktori G:\Pribadi\MyProgramming\Java\JavaProject\Blog\src.

Ant juga mengenal property. Dalam file build.xml property dinotasikan dengan syntax property. Property digunakan dalam file build.xml, sebagai pengganti suatu nilai yang terlalu panjang, seperti misalnya nama direktori. Jika bari-baris dalam contoh diatas untuk direktorinya kita ganti dengan menggunakan property maka file build.xml di atas menjadi seperti berikut ini:

<project name="Blog" default="compile" basedir=".">
<!--Define Params-->
<property name="src" value="${basedir}/src"/>
<property name="output" value="${basedir}/output"/>

<target name="prepare">
<mkdir dir="${output}"/>
</target>

<target name="compile" depends="prepare">
<javac srcdir="${src}" destdir="${output}"/>
</target>

<target name="clean">
<delete dir="${output}"/>
</target>
</project>

Dalam baris-baris contoh diatas kita bisa melihat bahwa, direktori kita bisa sederhanakan dengan menambahkan baris property, dan kemudian pada task prepare dan task compile, kita memanggil property tsb menjadi sebuah variabel direktori. Dalam baris tersebut kita juga menambahkan satu task yang bisa di eksekusi yaitu task clean berguna untuk menghapus direktori-direktori tertentu.

Dalam mendistribusikan sebuah aplikasi yang kita buat dengan bahasa pemrograman java, sangat dianjurkan untuk mem-packing aplikasi kita dalam bentuk jar file, apalagi jika program yang kita buat dengan java terdiri dari begitu banyak kelas. Dengan Jar file, file-file class hasil dari kompilasi java yang banyak tadi dapat lebih mudah kita pelihara, karena hanya berisi satu file jar saja Jar file sebenranya adalah file arsip java, namun kelas-kelas didalamnya dapat di eksekusi meskipun terbungkus dalam sebuah arsip. Ketika kita mengeksekusi sebuah jar file yang berisi begitu banyak kelas, kita harus membuat sebuah informasi dalam jar file tsb. Informasi tsb berisi kelas utama atau main class yang harus di eksekusi ketika jar file dipanggil. Informasi tsb diletakkan dalam sebuah file bernama manifest.mf yang diletakkan dalam folder META-INF. Dalam file manifest ini juga dituliskan informasi-informasi dependensi program kita terhadap library-library yang digunakan.

Perhatikan baris-baris syntax build.xml,dibawah ini:

<project name="Blog" default="compile" basedir=".">
<!--Define Params-->
<property name="src" value="${basedir}/src"/>
<property name="output" value="${basedir}/output"/>
<property name="lib" value="${basedir}/lib"/>
<property name="dist" value="${basedir}/dist"/>

<target name="prepare">
<mkdir dir="${output}"/>
</target>

<target name="make_jar” depends="compile”>
<jar jarfile="${dist}/test_blog.jar">
<fileset dir="${build}">
<include name="**"/>
</fileset>
<manifest>
<attribute name="Class-Path" value="lib/log4j-1.2.8.jar lib/commons-httpclient-2.0-rc2.jar lib/jodd.jar ."/>
</manifest>
</jar>
</target>

<target name="compile" depends="prepare">
<javac srcdir="${src}" destdir="${output}">
<classpath>
<pathelement location="${lib}/ log4j-1.2.8.jar "/>
<pathelement location="${lib}/commons-httpclient-2.0-rc2.jar"/>
<pathelement location="${lib}/jodd.jar"/>
</classpath>
</javac>
</target>

<target name="clean">
<delete dir="${output}"/>
<delete dir="${dist}"/>
</target>
</project>

Pada baris diatas dapat kita lihat, ada beberapa hal yang kita tambahkan. Penambahan pertama kita lakukan pada baris property, dimana kita menambah suatu property baru yang mewakili direktori lib. Penambahan selanjutnya ada pada task compile. Penambahan yang kita lakukan pada baris ini dilakukan apabila dalam source-code aplikasi java yang kita buat kita juga menggunakan library-library lain. Penambahan baris pada task compile berguna untuk menambahkan classpath library-library tsb, ketika kompilasi source code program dijalankan pada task compile tsb.

Pada baris tsb kita juga menambahkan suatu task baru yaitu task make_jar, fungsi dari task ini adalah membuat sebuah file arsip java yang bernama test_blog.jar. Dimana isi dari jar file ini adalah semua file hasil kompilasi . Isi dari jar file ini ditandai dalam blok fileset pada task make_jar. Bisa saja kita membatasi isi dari file-file kelas yang akan masuk dalam file jar tsb, hanya tinggal mengganti nilai dari tag include name diatas dan kita isi dengan file yang kita perlukan saja. Catatan: tag include name ini boleh lebih dari satu namun harus tetap ada dalam blok fileset.

Kemudian kita juga bisa lihat dalam task make_jar tsb, ditambahkan tag manifest, tag inilah yang akan menuliskan informasi dalam jar file. Semua informasi tersebut nantinya akan di tulis dalam sebuah file bernama manifest.mf yang diletakkan dalam folder META-INF dalam file jar yang yang dihasilkan.

Demikianlah sedikit pembahasan syntax-sytax dalam suatu file build.xml yang dapat dieksekusi oleh Antoher Neat Tool (Ant), masih banyak lagi tag-tag yang bisa digunakan, silahkan anda mencoba sendiri, dengan berpandu pada API-API yang memang sudah disediakan oleh ant itu sendiri.

Semoga bermanfaat.


Menteng, Nov 30, 2008

josescalia 

23 November 2008

Aksespraktis.net di jahili

Kali ini saya akan sedikit bercerita tentang dinamika kampus dimana saya berkuliah. Suatu kali ada seorang dosen yang mengajar di kelas saya mempunyai teknik yang sedikit berbeda dengan dosen-dosen lainnya dalam menentukan dan mengambil nilai bagi para mahasiswanya termasuk kelas saya. Cara mengambil nilai dosen ini adalah dengan cara meghitung seberapa aktif mahasiswanya dalam berkatifitas di internet. Guna mencapai tujuan ini, sang dosen membuat sebuah website dimana mahasiswanya diwajibkan memberi komentar terhadap artikel-artikel yang ada pada website tsb. Semakin banyak posting komentar yang dibuat oleh mahasiswa terhadap suatu artikel dalam website itu, maka akan semakin tinggi pula nilai mahasiswa yang memberi komentar tsb.

Cara dosen ini bisa dibilang cukup berhasil, sebab memang banyak juga komentar-komentar artikel pada website itu. Satu artikel yang berumur seminggu saja bisa mendapatkan komentar sedikitnya 100 sampai 200 komentar. Sekilas jika dilihat website dosen yang diberi nama aksespraktis.net ini adalah sebuah website blog. Dan memang dosen ini menggunakan software web blog wordpress. Yang mana software ini termasuk software web blog populer saat ini, diperkaya dengan fitur-fitur canggih seperti penghitungan komentator terbanyak atau artikel dengan komentar terbanyak, membuat software ini begitu sempurna untuk tercapainya tujuan sang dosen.

Saat dosen ini mengumumkan teknik penilaiannya di kelas saya, kelas saya termasuk kelas yang dirugikan, sebab dosen tersebut mengumumkan cara penilaiannya itu setelah perkuliahan telah berjalan selama setengah semester, sementara mahasiswa dari kelas lain yang juga diajar oleh dosen ini sedikitnya telah mem-posting komentar sekitar 70 sampai dengan 80 komentar. Namun keadaan tersebut bukan karena kesengajaan sang dosen, tapi lebih disebabkan karena situasi. Dosen yang sedang saya ceritakan ini adalah dosen pengganti dari dosen sebelumnya yang tidak pernah masuk mengajar kuliah di kelas saya dari awal semester. Dosen pengganti ini cukup fair menyiasati keadaan, di kelas saya dia hanya mewajibkan mahasiswa untuk mem-posting paling tidak 70-80 komentar untuk mendapatkan nilai tinggi katakanlah nilai A, sementara teman mahasiswa dari kelas lain paling tidak harus mem-posting di atas 200 komentar untuk mendapatkan nilai yang sama.

Saya dan teman-teman lain yang sekelaspun berlomba posting komentar sebanyak-banyaknya pada website tersebut guna mendapatkan nilai tertinggi yang bisa kita capai. Di antara saya dan teman-teman saya yang saling berlomba posting ini, ada seorang teman sekelas yang memang aktif di dunia hacking, lucunya saya kenal teman saya yang satu ini justru jauh sebelum saya kuliah di BSI. Kami sama-sama jadi member sebuah forum internet yang membahas tentang hacking di Indonesia, forum tsb adalah echo.or.id. Tapi saya tidak pernah kenal muka dengan teman saya yang satu ini, yang saya tahu pasti YM-ID-nya sudah ada pada list YM saya sejak 2 tahun lalu.(What a small world...!!!).

Profil teman saya ini lumayan banyak dikenal oleh para pengikut setia forum echo.or.id, karena teman saya ini pernah menemukan sebuah bugs/celah dalam friendster yang memungkinkan kita bisa men-deface halaman depan friendster seseorang. Bugs tersebut di-posting di forum echo.or.id dan website pribadinya. Ia juga mengaku pernah menemukan bugs pada jobsdb.com yang berupa SQL Injection. Saat ini saja yang saya tahu, dia memiliki beberapa account pada web hosting, yang mana account tsb didapat dari hasil dia melakukan aktifitas hackingnya. Pendeknya teman saya ini memang punya banyak pengalaman dalam dunia hacking-menghacking. Oh ya..ID teman saya ini di dunia maya adalah X-ACE, silahkan cari sendiri di Google profil X-ACE ini kalo ingin lebih tahu.

Kembali ke aksespraktis.net

Ketika X-ACE tahu perihal tentang dosen pengganti dan websitenya ini dan juga cara penilaian ini, timbul rasa iseng dalam pikirannya. Saat itu mungkin si X-ACE berpikir bagaimana cara cepatnya untuk bisa jadi komentator terbanyak dan mendapatkan nilai bagus dari dosen ini, tanpa perlu posting seperti teman-teman yang lain. Setelah diamati beberapa saat, X-ACE memutuskan untuk membuat sebuah exploit/program yang dirasa paling cepat dan mudah menurutnya. ya.. akhirnya dia membuat sebuah exploit dengan menggunakan script PHP.

Konsep dari exploit yang dibuat X-ACE ini sangat sederhana. Exploit ini hanya me-looping posting komentar sebanyak yang dia inginkan ke aksespraktis.net.

Begini gambaran exploit yang di buat oleh X-ACE.

Pada software web blog wordpress yang digunakan oleh sang dosen dalam membuat website aksespraktis.net, ada sebuah file yang menerima setiap posting komentar sebuah artikel. File tersebut adalah wp-comments-post.php, semua komentar terhadap sebuah artikel akan diproses oleh file ini. X-ACE tinggal mengarahkan posting yang berasal dari exploit-nya ke url dimana file tsb berada yaitu http://www.aksespraktis.net/wp-comments-post.php, buat orang yang pernah dan biasa mengoprek-oprek software ini tahu persis paramater-paramater apa saja yang harus di set ketika mem-posting ke file ini. Demikian juga dengan X-ACE, ia tahu persis paramater-parameter yang harus di set pada exploitnya ketika menembak url ini. Parameter-parameter itu diantaranya adalah username, email si pengirim komentar, website si pengirim komentar, isi komentarnya, dan id dari artikel yang ingin dikomentarinya. Selain isi komentar paramater-parameter yang lain dapat di set secara statis/tetap pada exploit X-ACE ini. Tapi isi komentar tidak boleh sama, sebab secara default, software wordpress ini akan menganggap komentar adalah spam jika isi komentar yang dikirim adalh sama.

X-ACE tidak kehilangan akal, untuk membuat isi komentar jadi tidak sama, ia menggunakan fungsi random character yang digabung dengan fungsi random integer yang memang tersedia dalam php untuk meng-generate isi komentar yang berbeda-beda. Sekarang exploit X-ACE telah selesai, tinggal tembak saja URL aksesparktis.net tsb. Aksipun dijalankan, dengan dua kali tembakan X-ACE kecewa, sebab ada message dari aksespraktis mengatakan exploitnya mem-posting telalu cepat, dalam satu detik ada lebih dari satu posting komentar, dan itu dianggap spam pula oleh software wordpress pada aksespraktis.net. “Hmm..” X-ACE bergumam sambil menghentikan serangannya. “Gue kasih delay satu detik saja kalau begitu..!”, oprek lagi script exploit tsb, dan all the perfect exploit script is done. Dan script pun kembali dijalankan, dan semuanya berjalan dengan lancar. Semua psoting komentar dari exploit yang dibuat oleh X-ACE diterima dengan mulus oleh aksespraktis.net. Pada looping sekitar 70-an X-ACE kembali menghentikan script exploit-nya. “Cukup sekian dulu posting-nya, besok lanjut lagi” gumamnya.

Demikian aksi X-ACE dan script exploit buatannya dalam mencapai tujuan iseng-isengnya. Pada hari kedua nama mbah-gondrong ada dalam list 10 koementator terbanyak dengan posting­-an sekitar 400-an komentar. Ya, X-ACE menggunakan nama mbah-gondrong sebagai username dalam script exploit yang dibuatnya.

Mungkin kode dan algoritma X-ACE dalam menyusun exploit-nya sederhana, tapi ide yang dimilikinyalah yang unik dan hebat, hanya orang yang kreatif dan inovatiflah yang mampu menelurkan ide seperti ini. Greets to X-ACE, jangan pandang aksi X-ACE ini sebagai ide yang destruktif, tapi coba kita pandang aksi ini sebagai sebuah kreatifitas dalam mencari pembuktian bahwa akan harus selalu ada perbaikan dari sebuah karya software. Bugs dan patch akan selalu harus ada dalam setiap perkembangan teknologi komputer dan internet. Demi tercapainya sebuah titik kesempurnaan dalam setiap karya teknologi, meski tingkat relatifitas kesempurnaan itu begitu bervariasi.

Oh ya..bagaimana dengan nasib aksesparktis.net, saat ini aksesprakis.net pun mengalami penyetingan ulang demi meminimalisir bugs-bugs yang memang ada pada software web blog wordpress. Saya pribadi percaya penuh kepada dosen-dosen saya yang menjadi admin pada aksepraktis.net ini, bahwa mereka bisa menerapkan security yang bagus pada web-nya, hanya saja bila memang masih ditemukan bugs di dalamnya, mungkin karena kealpaan dosen-dosen saya yang juga manusia, manusia yang pasti punya rasa lelah, lupa dan segala kekurangan yang memang ada pada diri manusia itu sendiri.

Semoga pengalaman ini menjadi pelajaran dan pengalaman bagi saya pada khususnya dan pembaca blog ini pada umumnya, sekian dan terima kasih.


Semoga bermanfaat

Josescalia


Shout out greets to :

  • X-ACE

  • Herwindo Dharmawan (Dosen dan admin aksespraktis.net)

  • Petruz Christhoper (Dosen dan admin aksespraktis.net)

  • http://www.aksespraktis.net

Membuat Aplikasi Web Pengirim Email dengan Java

Dalam sebuah website kita sering kali menemui fitur yang interaktif yang memungkinkan user pengguna web site tersebut dapat mengirimkan email kepada orang lain. Fitur ini sering disebut sebagai web-mailWeb Mail adalah suatu aplikasi web yang mampu mengirim dan membaca email melalui browser. Banyak aplikasi web mail yang mungkin sering kita gunakan, seperti yahoo mailgmail dan lain-lain.

Pada pemanfaatan aplikasi web mail, beberapa developer web-site juga menggunakannya sebagai suatu komunikasi antara pengguna web site tsb dengan pihak internal pemilik web site, misal fitur mengirimkan email kepada admin sebuah web-site seperti link berikut.

Kali ini kita akan mencoba membuat suatu aplikasi pengirim email berbasis web. Aplikasi web kita kali ini akan kita batasi hanya pada mengirimkan email saja, tidak membaca suatu email, mungkin pada lain kesempatan kita nanti akan membahas bagaimana cara pembuatan aplikasi web yang mampu membaca email dari suatu email server yang ada.

Ok kita langsung saja.

Untuk pembuatan aplikasi web pengirim email dengan java ini kita membutuhkan beberapa library/pustaka. Library tersebut adalah mail.jar dan activation.jar. silahkan anda download pada link berikut ini.

  1. mail.jar

  2. activation.jar

Skenario membuat aplikasi ini adalah sebagai berikut:

Dari sebuah form html standard yang berisi beberapa input type yang diperlukan kita akan melakukan post dengan metode HTTP POST ke sebuah servlet yang berisi metode untuk mengirimkan email. Kemudian status pengiriman email tsb kita tampilkan dalam bentuk html.


Pada form html standar kita memerlukan beberapa item input type dan sebuah text area. Tampilan form tsb kurang lebih seperti contoh gambar dibawah ini :

Sementara untuk skenario servlet kita bisa menyusunnya dengan langkah-langkah sebagai berikut:

  1. Inisialisasi nama smtp host pada metode init servlet

  2. Inisialisasi semua parameter yang dikirimkan oleh form html standar.

  3. Dalam blok try-catch lakukan langkah-langkah berikut :

    • Buat Session untuk pengiriman email

    • Lakukan konstruksi obyek message

    • Setting alamat pengirim

    • Setting alamat penerima

    • Setting isi email

    • Lakukan pengiriman email

    • Cetak status pengiriman email lewat html

  1. Untuk catch-nya kita gunakan untuk mengakomodir status pengiriman email yang gagal.

  2. Print out status pengiriman email dalam bentuk html

Untuk skenario servlet tsb dibawah ini adalah kode-kode programnya.

package org.mojo.mail.web.servlet;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

/**
* Created by IntelliJ IDEA.
* User: Muhammad Yusuf
* Date: 23 Nov 08
* Time: 13:27:09
* To change this template use File | Settings | File Templates.
*/
public class SendMailServlet extends HttpServlet {

private String smtpHost;

//initialize this servlet to get SMTP Host Name to use in sending message
public void init(ServletConfig config) throws ServletException {
super.init(config);
smtpHost = config.getInitParameter("smtpHost");
}

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String from = req.getParameter("from");
String to = req.getParameter("to");
String cc = req.getParameter("cc");
String bcc = req.getParameter("bcc");
String subject = req.getParameter("subject");
String text = req.getParameter("text");

String status;
try {
//create java mail session
Properties prop = System.getProperties();
prop.put("mail.smtp.host", smtpHost);
Session session = Session.getInstance(prop, null);

//construct the message
MimeMessage message = new MimeMessage(session);

//set the from adress
Address fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);

//parse and set the recipient
Address[] toAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toAddress);
Address[] ccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.CC, ccAddress);
Address[] bccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.BCC, bccAddress);

//set The Subject and Text
message.setSubject(subject);
message.setText(text);

//begin send Message
Transport.send(message);
status = "Your Message has sent";


} catch (AddressException aex) {
status = "There was an error when parsing the address";
} catch (SendFailedException sfe) {
status = "There was an error when sending the Message";
} catch (MessagingException me) {
status = "There was unexpected error";
}

//print out status in display
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
writer.println("<html><head><title>Status</title></head>");
writer.println("<body><p>" + status + "</body></html>");
writer.close();

}
}

Mari kita bahas satu per-satu kode tsb :


package org.mojo.mail.web.servlet;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

Seperi biasa, kode diatas adalah baris-baris dimana kita mendeklarasikan package dimana servlet kita dibuat dan import-import library yang kita butuhkan.

public class SendMailServlet extends HttpServlet {
………..
…….
}

Seperti yang kita lihat diatas kita membuat suatu servlet yang bernama SendMailServlet, karena ini adalah sebuah servlet maka kita harus menambahkan extends HttpServlet disana. Kemudian kita membuat sebuah file deployment descriptor(web.xml) yang nantinya akan kita letakkan dalam /webapps/{WebApp}/WEB-INF/

Isi dari file deployment descriptor disini adalah seperti gambar berikut ini :

Pada file tsb kita bisa melihat bahwa servlet yang kita buat tadi kita definsikan di sini dengan nama sendMessage, dimana nama servlet ini kemudian kita mapping ke sebuah url /sendMessage. Oleh karena itu dalam file standar html tadi action-nya mengarah ke url ini. Perhatikan juga kita menginisialisi sebuah parameter di file web.xml ini dengan nama parameternya adalah : smtpHost dan nilai dari parameter ini adalah smtp.speed.net.id, nilai ini bisa kita rubah tergantung smtp mana yang akan kita gunakan untuk mengirim email pada aplikasi web kita ini.

Sekarang kita lihat baris lainnya pada servlet:

    private String smtpHost;

//initialize this servlet to get SMTP Host Name to use in sending message
public void init(ServletConfig config) throws ServletException {
super.init(config);
smtpHost = config.getInitParameter("smtpHost");
}

Kita bisa melihat pada kode diatas ada sebuah variabel yang kita deklarasikan bernama smtpHost, dan variabel ini bertype string. Kemudian pada baris selanjutnya kita melihat bahwa pada method init, variabel smtpHost ini kita isi nilainya dengan mengambil nilai dari web.xml yang tadi sebelumnya kita buat, pengambilan nilai dari web.xml tadi dengan menggunakan obyek ServletConfig.

Kemudian kita lihat metode doPost pada servlet ini :

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String from = req.getParameter("from");
String to = req.getParameter("to");
String cc = req.getParameter("cc");
String bcc = req.getParameter("bcc");
String subject = req.getParameter("subject");
String text = req.getParameter("text");

String status;
…………
………..
}

Baris tersebut adalah baris dimana kita mengambil nilai-nilai yang dilempar oleh form standar html dan kemudian memasukkannya ke dalam sebuah variabel. Pada baris ini kita juga mendefinisikan sebuah variabel yang nantinya kita pakai untuk menampilkan status pengiriman email, variabel tsb bernama status dengan type data String.

Untuk skenario ke-3 dalam servlet ini kita lakukan dalam blok try-catch seperti contoh berikut:

…………..
try {
//create java mail session
Properties prop = System.getProperties();
prop.put("mail.smtp.host", smtpHost);
Session session = Session.getInstance(prop, null);

//construct the message
MimeMessage message = new MimeMessage(session);

//set the from adress
Address fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);

//parse and set the recipient
Address[] toAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.TO, toAddress);
Address[] ccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.CC, ccAddress);
Address[] bccAddress = InternetAddress.parse(to);
message.setRecipients(Message.RecipientType.BCC, bccAddress);

//set The Subject and Text
message.setSubject(subject);
message.setText(text);

//begin send Message
Transport.send(message);
status = "Your Message has sent";


} catch (AddressException aex) {
…………..
………….

Dalam kode di atas kita bisa melihat bahwa satu demi satu skenario servlet yang ada pada point ke-3 kita lakukan, dari mulai membuat sebuah session java mail sampai pada melakukan pengiriman message dan kemudian kita mengisi nilai untuk variabel status di sana.

Sekarang mari kita lihat kode-kode pada blok catch atau pada skenario servlet point ke-4.

………….
} catch (AddressException aex) {
status = "There was an error when parsing the address";
} catch (SendFailedException sfe) {
status = "There was an error when sending the Message";
} catch (MessagingException me) {
status = "There was unexpected error";
}
………….
………….

Pada kode diatas ini, peranan variabel status kita optimalkan, disini kita mengisi variabel status dengan nilai yang sesuai dengan error yang dapat saja terjadi pada servlet kita. Dari mulai error salah alamat email pengirim dan penerima sampai pada error yang memang tidak diketahui.

Tibalah kita pada baris-baris terakhir kode-kode servlet yang kita buat

……..
//print out status in display
res.setContentType("text/html");
PrintWriter writer = res.getWriter();
writer.println("<html><head><title>Status</title></head>");
writer.println("<body><p>" + status + "</body></html>");
writer.close();
}
…….

Pada baris-baris terakhir kode ini, kita membuat sebuah response berupa halaman html yang menginformasikan status dari pengiriman email melalui servlet yang kita buat tadi.

Mudah bukan..? silahkan dicoba dan silahkan modifikasi sesuai dengan kebutuhan dan keinginan anda.


Semoga Bermanfaat


Menteng, 23 November 2008

Josescalia


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

05 November 2008

Arsip Tulisanku, Kembali Ku Temukan

Akhirnya, saya menemukan kembali arsip tulisan saya yang dulu pernah di muat di Tabloid PC-Plus Edisi 185, 20-26 Juli 2004. Tulisan yang dulu saya maksudkan untuk menggali kreatifitas para Computer Freak ini, secara personal saya sendiri tidak punya kopiannya, sebab saya ingat betul waktu tabloid yang memuat tulisan tsb saya beli, saat itu juga terjadi banjir di rumah saya sehingga semua bukti fisik dari artikel saya itu rusak dan akhirnya musnah entah kemana sebelum saya mampu abadikan.
Sedang iseng, sehabis menyantap sarapan pagi ini tanggal 06 November 2008 pukul 9.30, saya ketik String "Mengalihbahasakan Sendiri Windows" dengan tanda kutip lengkap di string tsb pada Google,  dan saya kaget ternyata ada 5 link yang termuat di hasil pencarian Google tsb, dan dalam link tsb ternyata ada file fisik yang bisa didownload.
Setelah saya buka hasil download tsb ternyata filenya berupa PDF file yang ternyata merupakan hasil scan asli Tabloid tsb. Alhamdulillah akhirnya ketemu kembali Tulisan ini. Meski sudah lama dan mungkin ilmu dalam artikel ini tidak bisa lagi digunakan, yang jelas ini sangat berarti buat saya.
Saya mengucapkan terima kasih yang sebanyak-banyaknya kepada admin/pengelola :
  1. http://www.ilma95.net
  2. http://pustaka78.com
  3. http://rumahebook.com
Yang telah mengabadikan tulisan saya bahkan dari sumbernya langsung yakni hasil scan Tabloid PC Plus edisi 185, 20-26 July 2004.
Jika anda ingin melihat tulisan tsb dalam bentuk aslinya yakni hasil scan Tabloid tsb. Silahkan download disini.

Thanks,
Semoga Bermanfaat

Josescalia