Selasa, 24 Mei 2011

SESSION MANAGEMENT

 SESSION MANAGEMENT PADA JAVA  
    fungsi sebenarnya session adalah sebagai tempat menyimpan informasi selama browser itu aktif dan session management juga menunjuk kepada semua aspek dari pengaturan user authentikasi dan management of active session.
Untuk lebih jelas kita bisa lihat program authentikasi login user dibawah ini dimana program ini dibuat dengan dua cara yaitu:      
 1. Pemrograman Java tapi dibuat dengan teknik pemrograman struktural dimana anatara design dan kontrol dijadikan langsung dalam satu file atauteknik menyatukan view/design dan kontrol
  2. Pemrograman menggunakan teknik model-view-control dimana teknik ini memisahkan antara design dan kontrol atau teknik dengan  memilah aplikasi menjadi tiga bagian.
      
        1. TEKNIK MENYATUKAN VIEW/DESIGN DAN KONTROL
             
            Satu Hal  yang pasti dalam praktek ini kita harus menggunakan database, gak perlu susah2 sie.. kita cuma perlu 2 field, pertama username dan kedua password. Setelah itu ikuti langkah2 untuk mengetikkan file2 jsp dan java berikut.

    Document   : connect
    Created on : 15 Mei 11, 10:15:00
    Author     : spy_hard
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="java.sql.*" %>
<%
    try {
        Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            out.print(e.getMessage());
            }
    String koneksi = "jdbc:mysql://localhost:3306/session";
    Connection con = DriverManager.getConnection(koneksi, "root", "");
    Statement st = con.createStatement();
    ResultSet rs;
%>

Setelah itu buat file lagi dan beri nama index.jsp dan isikan sintaksnya

<%--
    Document   : index
    Created on : 15 Mei 11, 10:25:34
    Author     : spy_hard
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<META http-equiv="Refresh" content="">
<title> Halaman Login</title>
<form method="POST" action="">
    <table border="0">
        <tr>
            <td>User Name</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" name="login" value="Login"></td>
        </tr>
    </table>
</form>
<%@include file="connect.jsp" %>
<%
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            if (username == null) {
                username = "";
            }
            if (password == null) {
                password = "";
            }
           rs = st.executeQuery("SELECT * from users where user='" + username + "' and password='" + password + "'");
            if (rs != null) {
                while (rs.next()) {
                    session.setAttribute("sessionusername", rs.getString("user"));
                    session.setAttribute("sessionpassword", rs.getString("password"));
                    response.sendRedirect("main.jsp");
                }
            } else if (rs == null) {
                response.sendRedirect("index.jsp");
            }
%> 

file index.jsp ini berfungsi untuk menampung parameter yang diinput oleh user beserta setting sessionnya.

Lalu selanjutnya buat file main.jsp sebagai halaman utama dari proses authentifikasi jika berhasil atau session sudah dibuat maka user bisa mengakses halaman ini. Sebaliknya jika tidak? Arahkan ke halaman awal login, yaitu index.jsp

<%--
    Document   : main
    Created on : 15 Mei 11, 10:36:30
    Author     : spy_hard
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<meta http-equiv="Refresh" content="">
<%
if ((String) session.getAttribute("sessionusername") == null && (String) session.getAttribute("sessionpassword") == null )
    {
        response.sendRedirect("index.jsp");
        }
    else if ((String) session.getAttribute("sessionusername") != null)
        {
        out.print("selamat Datang");
        out.print("<a href ='logout.jsp'>Logout</a>");
        }
%>


Selanjutnya buat file untuk menghapus session. Dalam kasus yang sering kita jumpai yaitu logout.jsp.

<%--
    Document   : logout
    Created on : 15 Mei 11, 10:44:33
    Author     : spy_hard
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%
    session.removeAttribute("username");
    session.removeAttribute("password");
    session.invalidate();
    response.sendRedirect("index.jsp");
%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Hello World!</h1>
    </body>
</html>
    Kemudian jadi dech,,langsung aja run Netbeans dan masukan username dan password yang didatabase pada form login.


2.  TEKNIK DENGAN MENGGUNAKAN MODEL VIEW-CONTROL

  Teknik Selanjutnya yaitu masih di program dan hal yang sama serta databasenya juga sama. Kita hanya perlu mengetik2 saja. Dengan syarat harus memahami. File pertama yang harus kita buat adalah login.java

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 *
 * @author spy_hard
 */
public class login extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        System.out.println("MySQL Connect Example.");
        Connection conn = null;
        String url = "jdbc:mysql://localhost:3306/";
        String dbName = "session";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "root";
        String password = "";
        String username= "";
        String userpass= "";
        String strQuery = "";
        Statement st = null;
        ResultSet rs = null;
        HttpSession session = request.getSession(true);

        try {
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url + dbName, userName, password);
            if ((request.getParameter("userName") != null)
                    && (request.getParameter("userName") !="") && (request.getParameter("password") != null)
                    && (request.getParameter("password") !="")){
                username = request.getParameter("userName").toString();
                userpass = request.getParameter("password").toString();
                strQuery ="select * from users where user ='"+username+"' and password='"+userpass+"'";

                System.out.println(strQuery);
                st = conn.createStatement();
                rs = st.executeQuery(strQuery);
                int count = 0;
                while (rs.next()) {
                    session.setAttribute("username", rs.getString("user"));
                    count++;
                }
                if (count > 0) {
                    response.sendRedirect("selamatdatang.jsp");
                } else {
                    response.sendRedirect("login.jsp");
                }
               } else {
                    response.sendRedirect("login.jsp");
            }
               System.out.println("terkoneksi ke database");
               conn.close();
               System.out.println("terputus dari database");
        } catch (Exception e) {
        }
    }
    }
     
Perhatikan kode diatas, pertama seperti biasa kita definisikan dulu koneksi ke database, kemudian ciptakan session dengan keyword.
HttpSession session = request.getSession(true);
hasil dari seleksi data dari database disimpan pada session “username”
session.setAttribute("username", rs.getString("user"));
kemudian buat model dari aplikasi yang akan kita buat. Beri nama dengan LoginBean.java.

package logbean;
/**
 *
 * @author Perdana
 */
public class LoginBean {
    private String username="";
    private String password = "";

    /**
     * @return the username
     */
    public String getUsername() {
        return username;
    }

    /**
     * @param username the username to set
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }
}


Kemudian buat file login.jsp sebagai tampilannya saja,,

<%--
    Document   : login
    Created on : 15 Mei 11, 15:12:15
    Author     : spy_hard
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
       <form method="POST" action="view.jsp">
    <table border="0">
        <tr>
            <td>User Name</td>
            <td><input type="text" name="userName"></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Login"></td>
        </tr>
    </table>
</form>
    </body>
</html>

Kemudian buatlah file view.jsp untuk menampung parameter yang diinput user dari interface di atas berikut untuk forward page ke controller login.

<%--
    Document   : view
    Created on : 15 Mei 11, 14:22:56
    Author     : spy_hard
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<%@ page language="Java" import="java.sql.*" import="logbean.LoginBean" %>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>DataBase Search</title>
    </head>
    <body>
        <jsp:useBean id="db" scope="request" class="logbean.LoginBean" >
            <jsp:setProperty name="db" property="username" value='<%= request.getParameter("userName")%>' />
            <jsp:setProperty name="db" property="password" value='<%= request.getParameter("password")%>' />
        </jsp:useBean>
        <jsp:forward page="login">
            <jsp:param name="userName" value="<%=db.getUsername()%>" />
            <jsp:param name="password" value="<%=db.getPassword()%>" />
        </jsp:forward>
    </body>
</html>

Perhatikan <%=request.getParameter(“username”)%> syntak tersebut sama halnya dengan $_POST[“username”] di php

Buat view selamatdatang.jsp berikut logout.jsp fungsinya hamper sama seperti pada teknik pertama.

<%--
    Document   : selamatdatang
    Created on : 15 Mei 11, 14:32:45
    Author     : spy_hard
--%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Selamat Datang</title>
    </head>
    <body>
        <br><br><br><br>
        <table align="center" style="border:lpx solid #000000;">
            <%
                if(session.getAttribute("username") !=null && session.getAttribute("username") !="") {
                   String user = session.getAttribute("username").toString();
            %>
            <tr><td align="center"><h1>Selamat datang <b><%=user%></b></h1></td></tr>
            <tr><td align="center"><a href="logout.jsp">Logout</a></td></tr>
            <%
                } else {
                    response.sendRedirect("login.jsp");
                    }
            %>
        </table>
    </body>
</html>


<%--
    Document   : logout
    Created on : 15 Mei 11, 14:45:56
    Author     : spy_hard
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<META content=""  http-equiv="Refresh">
<%
    session.removeAttribute("username");
    session.invalidate();
    response.sendRedirect("login.jsp");
%>


Kekurangan dan Kelebihan Pada kedua Teknik tersebut.
1.       Teknik Pertama
Teknik pertama dengan mode Struktural dan tertumpuk dalam satu file memang terlihat sangat mudah dan gak ribet, apalagi program ini mirip dengan program PHP, tetapi coba dech kita renungkan dengan sedalam-dalamnya sampai kehakikatnya, bahwa program pertama ini sangat rentan dengan perbuatan yang tidak bertanggung jawab. Mengapa Demikian...
Karena teknik ini data yang seharusnya hanya programer yang tahu seperti nama tabel, database, dan field2 lainya dapat di ketahui oleh designer. Dan bisa saja si designer melakukan hal2 yang tidak kita inginkan. Dengan kata lain teknik pertama TIDAK AMAN karena tidak dilakukan encapsulation.
<%
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            if (username == null) {
                username = "";
            }
            if (password == null) {
                password = "";
            }
            rs = st.executeQuery("SELECT * from users where user='" + username + "' and password='" + password + "'");
            if (rs != null) {
                while (rs.next()) {
                    session.setAttribute("sessionusername", rs.getString("user"));
                    session.setAttribute("sessionpassword", rs.getString("password"));
                    response.sendRedirect("main.jsp");
                }
            } else if (rs == null) {
                response.sendRedirect("index.jsp");
            }
%>

2.      Teknik Kedua
Teknik kedua ini memang sangat ribet dimana banyak sekali yang harus kita deklarasikan sistem kontrolnya pun sulit untuk dibuat, tetapi apabila kita ingin buat project yang besar, teknik ini sangat efektif sekali karena cara pembuatannya yang aman, orang lain tidak akan mampu lihat dimana kita nyimpan data penting kita karena sistem kontrol ini kita sendiri yang pegang, si design cukup kita beri varibel-variabel aja. Jadi dia nggak tahu dimana letak database kita.
 file yang perlu didesign cuma ini doank kq..

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
       <form method="POST" action="view.jsp">
    <table border="0">
        <tr>
            <td>User Name</td>
            <td><input type="text" name="userName"></td>
        </tr>
        <tr>
            <td>Password</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Login"></td>
        </tr>
    </table>
</form>
    </body>
</html>

Analisa
1.    Project 1 TEKNIK DENGAN MENUMPUK PADA VIEW DARI APLIKASI
·      secara struktural project pertama ini sama dengan php karena terdapat koneksi.
·      lebih simple tidak lebih ribet, hanya terdapat 6 file jsp
·      semua koneksi ke databese dimuat didalam file index, sedangkan index adalah tampilan awal sebuah aplikasi yang kita buat.
·      sintak ini tidak dimungkinkan untuk ditumpuk pada view/ terdapat pada index, variablenya di tembak langsung dari database.
- session.setAttribute("sessionusername", rs.getString("username"));
- session.setAttribute("sessionPassword", rs.getString("password"));
·      memungkinkan databese bisa diserang oleh seorang yang ingin berlaku jahat.
·      Keamanan data tidak layak untuk menggunakan project menumpuk pada satu bagian saja.

2.    project 2 TEKNIK DENGAN MEMILAH APLIKASI MENJADI TIGA BAGIAN
·      teknik ini yang mengacu konsep model-view-control tidak ditumpuk pada satu bagian saja.
·      file yang terdapat pada project ini lebih ribet untuk dipahami jika dibanding project pertama.
·      terdapat 4 file jsp dan 2 file java class yang semuanya terstruktur dan bermetode.
·      keamanan data lebih terjamin, databasenya sulit untuk diserang.
·      project yang ke dua murni hanya pada java class pada file loginbean dan login, sedangkan index-nya hanya sebuah model view dan tidak menembak langsung ke database separti pada aplikasi pertama.

Kesimpulan
Dari hasil percobaan 2 project diatas saya dapat memahami, dan dapat ditarik kesimpulan, aplikasi/ project pertama menggunakan, TEKNIK DENGAN MENUMPUK PADA VIEW DARI APLIKASI. login user untuk koneksi ke data base ini dianggap tidak efektif/ aplikasi yg dibuat ditumpuk pada satu bagian saja ini tidak memenuhi standar keamanan yg layak dikaranakan sintak/login untuk user semuanya bisa dilacak pada index.jsp sedangkan index adalah tampilan awal dari sebuah aplikasi yang kita buat. disini siapa yang ingin berlaku jahat dengan mudah bisa login ke database dan data basenya bisa diserang, variable yang digunakan disini ditembak langsung pada string user neme dan passwordnya. sedangkan aplikasi/proyak kedua menggunakan, TEKNIK DENGAN MEMILAH APLIKASI MENJADI TIGA BAGIAN. yaitu teknik konsep model-view-control. login user untuk koneksi ke database ini sudah memenuhi standar keamanan yang layak/baik digunakan dibandingkan pada project pertama teknik ditumpuk pada satu bagian saja. karena pada project yang ke dua murni hanya pada login bean, dan indexnya hanya sebuah model view tidak menembak langsung ke database separti pada aplikasi pertama. jadi dari kedua project diatas telah dapat dibandingkan aplikasi/ project yang kedua lebih aman, dan lebih mudah digunakan pada peng-aplikasiannya dan memungkinkan