[Java][Servlet] 帳號密碼登入 login 製作

使用 Servlet 製作帳號密碼的登入驗證機制,可以在 web.xml 快速新增、刪除使用者~
程式碼上都有寫註解,可以參考看看

主要程式碼 

getInitParameterNames():取得 web.xml <init-param><param-name>,並返回 Enumeration<E> 型態
getInitParameter() :取得 web.xml <init-param><param-value>
request.getRequestDispatcher("/WEB-INF/notice.html").forward(request, response)
forward 為內部轉址用的方法,可以轉到 WEB-INF 資料夾底下的 HTML 檔



一、程式結果
二、程式碼



一、程式結果

登入前,輸入 web.xml 上設定的初始化參數

登入後,可以查看 notice.html 檔案,且 notice.html 因為是存放於 WEN-INF 資料夾底下,該資料夾有保護機制,如果知道檔案位置、名稱等也無法隨變進入查看


二、程式碼

Project 類型: Dynamic Web Project
Project 名稱: servlet
Package 名稱: idv.ycc.servlet
Class 類型: Servlet
Class 名稱: InitParamServlet.java
Html 路徑: servlet/WebContent/WEB-INF
Html 名稱: notice.html

如果有直接 copy 程式碼,請盡量用以上的名稱,避免出現小錯誤!

InitParamServlet.java

package idv.ycc.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/InitParamServlet")
public class InitParamServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
       
    public InitParamServlet() {
        super();
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setCharacterEncoding("UTF-8");    //設定response編碼方式
    request.setCharacterEncoding("UTF-8");     //設定request編碼方式
    response.setContentType("text/html");      //設定此servlet的內文類型為HTML
    
    PrintWriter out = response.getWriter();    //取得response的PrintWriter字元流(傳送字元對象)
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println("<HEAD><TITLE>登錄查看 Notice 文件</TITLE></HEAD>");
    out.println("<style>body, td, div {font-size: 12px }</style>");
    out.println("<BODY>");
    out.println("<form action='" + request.getRequestURI() + "' method='post'>");
    out.println("<div>");
        out.println("<span>帳號:</span>");
    out.println("<input type='text' name='username' style='width:200px; '><br/>");
    out.println("</div>");
    out.println("<div>");
    out.println("<span>密碼:</span>");
    out.println("<input type='password' name='password' style='width:200px; '><br/><br/>");
        out.println("</div>");
    out.println("<input type='submit' value=' 登錄 '>");
    out.println("</form>");
    out.println("</BODY>");
    out.println("</HTML>");
    out.flush();   //釋放緩衝區,避免資料沒有完全輸出,或滿出發生錯誤
    out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");   //name=username的input做提交的動作
String password = request.getParameter("password");   //name=password的input做提交的動作
Enumeration<String> params = getInitParameterNames(); //取得所有初始化參數名稱

//params仍有參數時→執行此程式 (走訪所有初始化參數)
while(params.hasMoreElements()) {
    String usernameParam = params.nextElement();              //取得參數名(帳號)
    String passwordParam = getInitParameter(usernameParam);   //取得參數值(密碼)
    
    if(usernameParam.equalsIgnoreCase(username) && passwordParam.equals(password)) {
        //因WEB-INF下的文件無法直接被讀取到,必須透過以下程式來呼叫(內部轉址用)
        //getRequestDispatcher("/WEB-INF/xxx.html").forward(request, response)
        request.getRequestDispatcher("/WEB-INF/notice.html").forward(request, response);
        return;
    }
}

doGet(request, response);    //帳密不正確時,則直接顯示登入頁面
}
}

web.xml

有其他不懂可先查看此文章的web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
   <servlet-name>InitParamServlet</servlet-name>
   <servlet-class>idv.ycc.servlet.InitParamServlet</servlet-class>
   <!-- 初始化參數 -->
   <init-param>
       <param-name>ycc</param-name>
       <param-value>0000</param-value>
   </init-param>
   <init-param>
       <param-name>admin</param-name>
       <param-value>admin</param-value>
   </init-param>
   <init-param>
       <param-name>guest</param-name>
       <param-value>guest</param-value>
   </init-param>
</servlet>

<servlet-mapping>
   <servlet-name>InitParamServlet</servlet-name>
   <url-pattern>/initparamservlet.io</url-pattern>
</servlet-mapping>
</web-app>

notice.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Notice</title>
</head>
<body>
   <h1>這是 Notice 文件</h1>
</body>
</html>


留言

  1. 可以創建好登入畫面
    但是不管帳號密碼錯誤都不能進入NOTICE畫面

    回覆刪除

張貼留言

這個網誌中的熱門文章

[日文] Google日文輸入法 簡單安裝說明

[面試] 日月光 設備工程師

[Windows] 還我 win7 相片檢視器!!