21.【任務案例:實現使用者自動登入】
阿新 • • 發佈:2018-12-13
任務目標
通過前面的學習,我們瞭解到Cookie可以實現使用者自動登入的功能。當用戶第1次訪問伺服器時,伺服器會發送一個包含使用者資訊的Cookie。之後,當客戶端再次訪問伺服器時,會向伺服器回送Cookie。這樣,伺服器就可以從Cookie中獲取使用者資訊,從而實現使用者的自動登入功能。 使用Cooke實現使用者自動登入後,當客戶端訪問伺服器的Servlet時,所有的Servlet都需要對使用者的Cookie資訊進行校驗,這樣勢必會導致在Servlet程式中書寫大量的重複程式碼。 為了解決上面的問題,可以在Filter程式中實現Cookie的校驗。由於Filter可以對伺服器的所有請求進行攔截,因此,一旦請求通過Filter程式,就相當於使用者資訊校驗通過,Servlet程式根據獲取到的使用者資訊,就可以實現自動登入了。通過本任務的學習,同學將會學會使用Filter實現使用者的自動登入功能
實現步驟
1.建立實體類user
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
2.建立登入頁面login.jsp
<html> <head></head> <center><h3>使用者登入</h3></center> <body style="text-align: center;"> <form action="${pageContext.request.contextPath}/LoginServlet" method="post"> <table border="1" width="600px" cellpadding="0" cellspacing="0"align="center"> <tr> <td height="30" align="center">使用者名稱:</td> <td><input type="text" name="username" />${errerMsg }</td> </tr> <tr> <td height="30" align="center">密 碼:</td> <td> <input type="password" name="password" /></td> </tr> <tr> <td height="35" align="center">自動登入時間</td> <td><input type="radio" name="autologin" value="${60*60*24*31 }" />一個月 <input type="radio" name="autologin" value="${60*60*24*31*3 }" />三個月 <input type="radio" name="autologin" value="${60*60*24*31*6 }" />半年 <input type="radio" name="autologin" value="${60*60*24*31*12 }" />一年 </td> </tr> <tr> <td height="30" colspan="2" align="center"> <input type="submit" value="登入" /> <input type="reset" value="重置" /> </td> </tr> </table> </form> </body> <html>
3.建立LoginServlet
@WebServlet("/LoginServlett")
public class LoginServlett extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 獲得使用者名稱和密碼
String username = request.getParameter("username");
String password = request.getParameter("password");
// 檢查使用者名稱和密碼
if ("itcast".equals(username) && "123456".equals(password)) {
// 登入成功
// 將使用者狀態 user 物件存入 session域
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
// 傳送自動登入的cookie
String autoLogin = request.getParameter("autologin");
if (autoLogin != null) {
// 注意 cookie 中的密碼要加密 itcast-123456
Cookie cookie = new Cookie("autologin", username + "-" +password);
cookie.setMaxAge(Integer.parseInt(autoLogin));
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
// 跳轉至首頁
response.sendRedirect(request.getContextPath()+ "/index.jsp");
}else {
request.setAttribute("errerMsg", "使用者名稱或密碼錯");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
4.建立登入成功後的首頁index.jsp
<html>
<head>
<title>顯示登入的使用者資訊</title>
</head>
<body>
<br>
<center>
<h3>歡迎光臨</h3>
</center>
<br>
<c:choose>
<c:when test="${sessionScope.user==null}">
<a href="${pageContext.request.contextPath}/login.jsp">
使用者登入</a>
</c:when>
<c:otherwise>
歡迎你,${sessionScope.user.username }!
<a href="${pageContext.request.contextPath }/LogoutServlet">登出</a>
</c:otherwise>
</c:choose>
<hr>
</body>
</html>
5.建立過濾器AutoLoginFilter
@WebFilter("/*")
public class AutoLoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
// 獲得一個名為 autologin的cookie
Cookie[] cookies = request.getCookies();
String autologin = null;
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("autologin".equals(cookies[i].getName())) {
// 找到了指定的cookie itcast-123456
autologin= cookies[i].getValue();
break;
}
}
if (autologin != null) {
// 做自動登入
String[] parts = autologin.split("-");
String username = parts[0];
String password = parts[1];
// 檢查使用者名稱和密碼
if ("itcast".equals(username)&& ("123456").equals(password)) {
// 登入成功,將使用者狀態 user 物件存入 session域
User user = new User();
user.setUsername(username);
user.setPassword(password);
request.getSession().setAttribute("user", user);
}
}
// 放行
chain.doFilter(request,resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
6.建立登出的LogoutServlet
@WebServlet("/LogoutServlett")
public class LogoutServlett extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//刪除session中的值
request.getSession().removeAttribute("user");
//刪除客戶端儲存的登入cookie
Cookie cookie=new Cookie("autologin","msg");
cookie.setPath(request.getContextPath());
cookie.setMaxAge(0);
response.addCookie(cookie);
response.sendRedirect(request.getContextPath()+"/index.jsp");
out.flush();
out.close();
}
}
執行http://localhost:8080/login.jsp 輸入使用者名稱稱密碼進入 後臺 關閉瀏覽器後,下次直接輸入後臺地址:http://localhost:8080/index.jsp 也能顯示使用者登入資訊。