ในที่นี้จะกล่าวถึงการใช้ 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 แทนครับ
ไม่มีความเห็น