一、為什麼醫療資訊系統需要登入?
前面完成的病患清單、詳細資料與修改功能,如果沒有任何登入機制,只要知道網址,就可能有人直接開啟頁面。
因此,今天要加入一個基本的登入流程,並透過 Session 記錄使用者是否已登入。
在 Servlet 中,可以使用 HttpSession 保存跨請求的登入狀態。這也是許多 Java Web 應用程式管理使用者狀態的基本方式。
二、建立登入表單
新增 login.jsp:
這裡使用 POST 傳送登入表單,避免帳號與密碼直接出現在網址中。不過,POST 本身並不等於加密,正式系統仍須使用 HTTPS。
三、建立 LoginServlet
為了先理解登入流程,以下使用教學用的固定測試帳號。這只是展示 Session 的方式,不代表正式系統應將帳號密碼寫死在程式碼中。
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// 僅供本機練習的測試帳號
boolean valid =
"demo".equals(username)
&& "demo123".equals(password);
if (valid) {
HttpSession oldSession = request.getSession(false);
if (oldSession != null) {
oldSession.invalidate();
}
HttpSession session = request.getSession(true);
session.setAttribute("loginUser", username);
response.sendRedirect(
request.getContextPath() + "/patient/list"
);
} else {
request.setAttribute(
"error", "帳號或密碼錯誤,請重新輸入。"
);
request.getRequestDispatcher(
"/login.jsp"
).forward(request, response);
}
}
}
測試時可以使用帳號 demo、密碼 demo123。正式部署前,必須改成從資料庫驗證帳號,並使用適當的密碼雜湊機制儲存密碼。
四、限制未登入者存取功能
只有登入頁面還不夠,還需要確認使用者在進入病患清單、詳細資料與修改頁面前,已經完成登入。
可以先在需要保護的 Servlet 中加入檢查:
HttpSession session = request.getSession(false);
if (session == null
|| session.getAttribute("loginUser") == null) {
response.sendRedirect(
request.getContextPath() + "/login.jsp"
);
return;
}
這段程式必須放在處理病患資料之前。
當功能越來越多時,將檢查集中在 Servlet Filter 會更容易維護;後續也應將不同角色的權限分開處理,不能只確認「有登入」就允許所有操作。
五、加入登出功能
建立一個簡單的 LogoutServlet:
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws IOException {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
response.sendRedirect(
request.getContextPath() + "/login.jsp"
);
}
}
登入後,可以在頁面加入登出連結:
登出
登出時呼叫 invalidate(),讓目前的 Session 失效。
六、今日小結
今天完成了登入表單、登入驗證、Session 與登出流程,也理解為什麼必須在每個受保護的功能中檢查登入狀態。
這是醫療資訊系統的重要基礎。不過,真正的醫療系統還需要角色權限、密碼安全、操作紀錄、連線加密與其他保護機制。
下一篇,我們來改善介面,讓已經具備基本功能的系統更容易操作。
參考資料:Jakarta EE 官方 Servlet 教學。