JSP使用cookie实现记住账号密码的功能

所谓自动登录,就是下次打开的时候不用再次输入账号密码,一定程度上方便了用户,但也有它的缺点,就是可能泄露用户信息。

HTTP的无状态性

HTTP的无状态性,是指当客户端发请求给服务器的时候,服务器会响应客户端的请求,但当客户端再次发请求给服务器时,服务器并不知道这就是刚刚那个客户端。简单的说,就是服务器没有记忆,不会记住客户端。

那这样我们要让服务器记住一些事情怎么办呢?比如要记住客户端输入的账户信息,这时我们就可以使用JSP的cookie来实现这个功能。

保存用户状态的两种方式

  • session
  • cookie

下面我们来讲讲怎么用cookie实现记住账号信息的功能。

在JSP中创建和使用cookie
1.创建cookie对象

Cookie cookie = new Cookie(String name, Object value);

2.写入cookie对象

response.addCookie(cookie);

3.读取cookie对象

Cookie[] cookies = request.getCookies();

Cookie的一些常用方法,可以查看API,这是传送门https://docs.oracle.com/javaee/6/api/

下面我们用代码来看看,代码分为三块,

  • 第一个是login.jsp,是用户的登陆界面,用户在此界面输入用户名和密码,在这个页面上,我们要判断用户是否选择了记住账号信息的选项,如果选择了,在账户输入框和密码输入框,我们就自动填上账户信息,如果没有勾选,则不填。
  • 第二个是dologin.jsp,顾名思义,就是处理用户的输入信息,在这个页面,先判断用户是否勾选了记住账号信息的选项,如果勾选了,我们先用request内置对象读取用户输入的信息,然后把值放入新建的cookie对象,最后用response写入cookie对象。如果没有勾选,则判断cookie里是否有值,如果有值,则设置cookie的有效期,使cookie过期。
  • 第三个是user_info.jsp,是显示用户信息的页面,超链接放在dologin.jsp里面。在这个页面,我们先先读取cookie的信息,如果不为空,则循环输出账号信息。
<!--login.jsp-->
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body> 
    <h1>用户登录</h1> 
    <hr> 
    <!-- 判断用户是否选择了七天内免登录,如果选择了,则输入框内初始化为用户的账户信息 --> 
    <% 
        request.setCharacterEncoding("utf-8"); 
        String username = ""; 
        String password = ""; 
        Cookie[] cookies = request.getCookies(); 
        if(cookies != null && cookies.length > 0) { 
            for(Cookie c:cookies) { 
                if(c.getName().equals("usernameCookie")) { 
                    // 解码 
                    username = URLDecoder.decode(c.getValue(), "utf-8"); 
                } else if(c.getName().equals("passwordCookie")) { 
                    password = URLDecoder.decode(c.getValue(), "utf-8"); 
                } 
            } 
        } 
    %> 
    <div> 
        <form action="dologin.jsp" method = "post"> 
            <table> 
                <tr> 
                    <td>用户名</td> 
                    <td><input type = "text" name = "username" value = "<%=username%>"></td> 
                </tr> 
                <tr> 
                    <td>密码</td> 
                    <td><input type = "password" name = "password" value = "<%=password%>"></td>
                </tr> 
                <tr> 
                    <td style = "margin-left:1px"><input type = "checkbox" name = "isChecked" checked = "checked">七天免登录</td> 
                    <td style = "margin-right:-1px"><input type = "submit" value = "submit"></td> 
                </tr> 
            </table> 
        </form> 
    </div>
</body>
</html>

用户登录界面,粗糙的写了一下。
这里写图片描述

<!--dologin.jsp-->
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录成功界面</title>
</head>
<body> 
    <h1>用户登录成功界面</h1> 
    <hr>
    <!-- 判断用户是否勾选了记住账户信息,如果勾选了,就使用cookie保存用户的账户信息,使用URLEncoder类进行编码,防止中文乱码 --> 
    <% 
    request.setCharacterEncoding("utf-8"); 
    // 首先判断用户是否勾选了记住账户信息,如果勾选了值默认是on,也可以通过input的value属性设置 
    String[] r = request.getParameterValues("isChecked"); 
    if(r != null && r.length > 0) { 
        // 获取输入的username和password,进行编码 
        String username = URLEncoder.encode(request.getParameter("username"), "utf-8"); 
        String password = URLEncoder.encode(request.getParameter("password"), "utf-8"); 
        // 新建cookie对象 
        Cookie usernameCookie = new Cookie("usernameCookie", username); 
        Cookie passwordCookie = new Cookie("passwordCookie", password); 
        // 设置cookie的有效期7天,单位为秒 
        usernameCookie.setMaxAge(604800); 
        passwordCookie.setMaxAge(604800); 
        // 写入cookie对象 
        response.addCookie(usernameCookie); 
        response.addCookie(passwordCookie); 
    } else { 
        //如果用户取消了记住账户信息,则应该对cookie里的信息进行清理 
        Cookie[] cookies = request.getCookies(); 
        if(cookies != null && cookies.length > 0) { 
            for(Cookie c:cookies) { 
                if(c.getName().equals("usernameCookie") || c.getName().equals("passwordCookie")) { 
                    // 使cookie过期 
                    c.setMaxAge(0); 
                    response.addCookie(c); 
                } 
            } 
        } 
    } 
    %> 
    <hr> 
    <a href = "user_info.jsp">查看用户详情</a>
</body>
</html>

这里写图片描述

<!--user_info.jsp-->
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户信息界面</title>
</head>
<body> 
    <h1>用户信息界面</h1> 
    <hr> 
    <%
    // 读取cookie里的信息
    request.setCharacterEncoding("utf-8"); 
    String username = ""; 
    String password = ""; 
    Cookie[] cookies = request.getCookies(); 
    if(cookies != null && cookies.length > 0) { 
        for(Cookie c:cookies) { 
            if(c.getName().equals("usernameCookie")) { 
                // 解码 
                username = URLDecoder.decode(c.getValue(), "utf-8"); 
            } else if(c.getName().equals("passwordCookie")) { 
                password = URLDecoder.decode(c.getValue(), "utf-8"); 
            } 
        } 
    } 
    %> 
    用户名:<%=username %><br> 
    密码:<%=password %><br>
</body>
</html>

这里写图片描述



过程大概就这这样子。大家可以自己拿源码去试试看。

猜你喜欢

转载自blog.csdn.net/a_helloword/article/details/79937705