1. 程式人生 > 實用技巧 >使用者登入模組 - 4 勾選:自動登入 退出登入

使用者登入模組 - 4 勾選:自動登入 退出登入

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);
    }
}