使用者登入模組 - 4 勾選:自動登入 退出登入
阿新 • • 發佈:2020-12-06
JavaWeb綜合案例 - 使用者登入:3 勾選:自動登入 退出登入
index.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="zh-CN"> <head> </head> <body> <%--判斷使用者是否登入,顯示不同介面--%> <div align="center"> <c:if test="${empty user}"> <a href="${pageContext.request.contextPath}/login.jsp" style="text-decoration:none;font-size:25px">登入</a><br> </c:if> <c:if test="${not empty user}"> <span style="font-size: 30px;color: orangered">歡迎您: ${user.username}</span> </c:if> </div> </body> </html>
LoginServlet.java
package com.itheima.web.servlet; import com.itheima.entity.User; import com.itheima.service.UserService; import org.apache.commons.beanutils.BeanUtils; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; /* 使用者登入 */ @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //1. 獲取表單請求引數 Map<String, String[]> map = request.getParameterMap(); User user = new User(); // 封裝到user物件中 BeanUtils.populate(user, map); //2. 呼叫service查詢 UserService service = new UserService(); // uu: 查詢資料庫返回的真實物件. user: 僅僅封裝了使用者名稱和密碼而已 User uu = service.login(user); //3. 判斷使用者是否存在 if (uu == null) { // 登入失敗 request.setAttribute("msg", "使用者名稱或密碼錯誤"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } //4. 使用者登入成功了 HttpSession session = request.getSession(); session.setAttribute("user", uu); ////////自動登入(儲存使用者名稱和密碼)///// String autoLogin = request.getParameter("autoLogin"); if (autoLogin != null) { // 使用者勾選了"自動登入" jack&1234 Cookie cookie = new Cookie("autoLoginCookie", uu.getUsername() + "&" + uu.getPassword()); cookie.setMaxAge(3 * 24 * 60 * 60); response.addCookie(cookie); } ////////自動登入(儲存使用者名稱和密碼)///// response.sendRedirect(request.getContextPath() + "/index.jsp"); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
AutoLoginFilter.java
package com.itheima.web.filter; import com.itheima.entity.User; import com.itheima.service.UserService; import com.itheima.utils.CookieUtils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException; @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; // 優化: 存在cookie,但是使用者已經登入了,則不需要進行自動登入 HttpSession session = request.getSession(); Object obj = session.getAttribute("user"); if(obj!=null){ //使用者已經登入 chain.doFilter(req, resp); // 放行 return; } //1. 獲取autoLoginCookie的值 String cookieValue = CookieUtils.getCookieValue(request, "autoLoginCookie"); //2. 判斷是否為空 if (cookieValue == null) { // 沒有勾選自動登入 chain.doFilter(req, resp); // 放行 return; } System.out.println("獲取cookie資料,進行登入"); // 勾選了自動登入, 獲取使用者名稱和密碼 jack&1234 String username = cookieValue.split("&")[0]; String password = cookieValue.split("&")[1]; //3. 封裝到物件中 User user = new User(); user.setUsername(username); user.setPassword(password); //4. 呼叫service登入了 UserService service = new UserService(); // uu: 查詢資料庫返回的真實物件. user: 僅僅封裝了使用者名稱和密碼而已 User uu = service.login(user); //5. 判斷使用者是否存在 if (uu == null) { // 登入失敗 request.setAttribute("msg", "使用者名稱或密碼錯誤"); request.getRequestDispatcher("/login.jsp").forward(request, resp); return; } //6. 使用者登入成功了 session.setAttribute("user", uu); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
KillCookieServlet.java
package com.itheima.a_cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
殺死Cookie
*/
@WebServlet("/killCookieServlet")
public class KillCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 再建立一個同名的Cookie
Cookie cookie = new Cookie("autoLogin", "");
//2. 設定持久化儲存時間為0
cookie.setMaxAge(0);
//3. 設定相同的有效訪問路徑
cookie.setPath(request.getContextPath());
//4. 返回瀏覽器端覆蓋原來的Cookie
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}