Using Java Filter to Control User Access to The Web Site


ในที่นี้จะกล่าวถึงการใช้ Filter เพื่อควมคุมการ access เว็ปเรา โดยที่เราต้องการให้ผู้ใช้ต้อง access ด้วย secure port (https://) เท่านั้น และต้องเข้าผ่านทางหน้า login เท่านั้น

ขั้นตอนที่ 1 สร้างคลาส HttpsFilter เพื่อทำการตรวจสอบว่าผู้ใช้ได้เข้าด้วย https หรือเปล่า ถ้าไม่ใช่ก็ให้แสดงข้อความบอกผู้ใช้ แต่ถ้าใช่ก็ให้ทำ filter อื่นถ้ามี

Code:
// HttpsFilter.java
package filter.demo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class HttpsFilter implements Filter {

  public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub
  }

  public void destroy() {
    // TODO Auto-generated method stub
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
   System.out.println ("็HttpsFilter is activated");
   RequestDispatcher rd = null;
   if (request instanceof HttpServletRequest) {
      HttpServletRequest req = (HttpServletRequest)request;
      String url = req.getRequestURL().toString();
      System.out.println(url);
      String http = url.substring(0, url.indexOf(':'));
      String dest;
         
      if (http.equals("http")) {
         dest = "/alert.html";
            
         System.out.println("Forward page to " + url.substring(0, url.lastIndexOf('/')) + dest);
         rd = request.getRequestDispatcher(dest);
            rd.forward(request, response);
      }
      else
         chain.doFilter(request, response); // allow to do another filter
   }
  }

}


ขั้นตอนที่ 2 สร้างคลาส LoginFilter เพื่อทำการตรวจสอบว่าผู้ใช้ได้เข้าผ่านหน้า login หรือยัง โดยในที่นี้จะใช้การตรวจสอบ attribute จาก session

Code:
// LoginFilter.java
package filter.demo;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class LoginFilter implements Filter {

  public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub
  }

  public void destroy() {
    // TODO Auto-generated method stub
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  throws IOException, ServletException {
   System.out.println ("LoginFilter is activated");
   RequestDispatcher rd = null;
   String session_id = (String)request.getAttribute("session_id");
   System.out.println ("session_id = "+session_id);
      if (session_id == null) {
        rd = request.getRequestDispatcher("/login.html");
         System.out.println ("Forward to /login.html");
        rd.forward(request, response);
      }
  }

}


ขั้นตอนที่ 3 สร้างคลาส LoginServlet เพื่อตรวจสอบว่าผู้ใช้สามารถยืนยันตัวตนได้ถูกต้อง หากใช่ก็จัดเก็บ session_id เอาไว้เพื่อให้ filter ตรวจสอบ

Code:
// LoginServlet.java
package filter.demo;

import java.io.IOException;

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

public class LoginServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  //Process the HTTP Get request
  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
       
   RequestDispatcher rd = null;

        // define user and password for testing
        final String USER = "abcd";
        final String PWD = "555";
       
        // get input parameter
        String user_id = request.getParameter("user_id");
        String password = request.getParameter("password");
       
        boolean auth = (USER.equals(user_id)) && (PWD.equals(password));
     System.out.println ("LoginServlet auth = "+auth);

        if (auth) {
            // read a session id
            String session_id = request.getSession().getId();
             System.out.println ("LoginServlet session_id = "+session_id);
            // store in session attribute
            request.setAttribute("session_id", session_id);
            // forward to output view
            rd = request.getRequestDispatcher("/welcome.html");
        }
        else {
           // forward to login page
            rd = request.getRequestDispatcher("/login.html");
        }
        rd.forward(request, response);
  }
   
  //Process the HTTP Post request
  public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
       doGet(request, response);
  }
}


ขั้นตอนที่ 4 สร้างหน้า login เพื่อให้ผู้ใช้ใส่ user_id และ password

Code:
// login.html
<http>
<body>
  <form name="form1" method="post" action="login">
    User ID :<input type=text name='user_id' size=13><br>
    Password :<input type=password name='password' size=14><br>
    <input type="submit" name="Submit" value="Submit">
  </form>
</body>
</html>


ขั้นตอนที่ 5 สร้างหน้า welcome

Code:
// welcome.html
<http>
<body>
  Welcome to the filter demo
</body>
</html>


ขั้นตอนที่ 6 สร้างหน้า alert

Code:
//alert.html
<http>
<body>
  This application require secure access (https://localhost:8443/filter)
</body>
</html>


ขั้นตอนที่ 7 สร้าง web.xml โดยที่ยังไม่ต้องใส่ filter

Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
     xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
     version="2.4">
 
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>filter.demo.LoginServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
     
  <welcome-file-list>
     <welcome-file>login.html</welcome-file>
  </welcome-file-list>
 
</web-app>


ขั้นตอนที่ 8 build a war file และ deploy application

เสร็จแล้วลอง access app ดูครับ จะเห็นได้ว่าเราสามารถเข้าได้ทุกด้าน
ึ8.1
http://localhost:8080/filter สังเกตุดูว่ามันจะแสดงขึ้นมาให้ผู้ใช้ใส่ user และ password
ึ8.2
https://localhost:8443/filter สังเกตุดูว่ามันจะแสดงขึ้นมาให้ผู้ใช้ใส่ user และ password เหมือนกัน
ึ8.3
https://localhost:8443/filter/welcome.html สังเกตุดูว่ามันจะแสดงข้อความต้อนรับ

ขั้นตอนที่ 9 ลอง modify web.xml โดยเพิ่มส่วนของ filter tag ลงไป

Code:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
     xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
     version="2.4">
 
  <!-- Define the filters within the Web Application -->
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>filter.demo.LoginFilter</filter-class>
  </filter>
  <filter>
    <filter-name>HttpsFilter</filter-name>
    <filter-class>filter.demo.HttpsFilter</filter-class>
  </filter>
 
  <!-- Map the filter to a Servlet or URL -->
  <filter-mapping>
    <filter-name>HttpsFilter</filter-name>
    <url-pattern>/login.html</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>HttpsFilter</filter-name>
    <url-pattern>/welcome.html</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/welcome.html</url-pattern>
  </filter-mapping>
     
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>filter.demo.LoginServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
     
  <welcome-file-list>
     <welcome-file>login.html</welcome-file>
  </welcome-file-list>
 
</web-app>


ขั้นตอนที่ 10 ลอง deploy application อีกที

ลอง access app ดูใหม่ครับ
ึ10.1
http://localhost:8080/filter สังเกตุดูว่ามันจะ alert ให้เข้าด้วย https
ึ10.2
https://localhost:8443/filter สังเกตุดูว่ามันจะแสดงขึ้นมาให้ผู้ใช้ใส่ user และ password ได้ตามปรกติ
ึ10.3
https://localhost:8443/filter/welcome.html สังเกตุดูว่ามันจะ forward page ไปหน้า login แทนครับ

คำสำคัญ (Tags): #java filter
หมายเลขบันทึก: 194560เขียนเมื่อ 16 กรกฎาคม 2008 15:44 น. ()แก้ไขเมื่อ 22 มิถุนายน 2012 14:33 น. ()สัญญาอนุญาต: ไม่สงวนสิทธิ์ใดๆจำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (0)

ไม่มีความเห็น

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท