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

news/2024/5/18 15:27:44 标签: JSP, cookie, 记住账号密码

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

HTTP的无状态性

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

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

保存用户状态的两种方式

下面我们来讲讲怎么用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>

这里写图片描述



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


http://www.niftyadmin.cn/n/1236458.html

相关文章

JSP超链接传递参数的一个小问题!!!

只是一个小问题&#xff0c;但却是致命的&#xff01;被坑了好多次了&#xff0c;记录一下&#xff0c;给自己提个醒。 JSP的URL传参有好多种方式&#xff0c;但目前只发现这一种方式有问题&#xff0c;就是这种方式 <a href "xxx.jsp?idxx"></a> 是…

《C++ Primer》学习笔记(十):泛型算法

《C Primer》学习笔记&#xff08;十&#xff09;&#xff1a;泛型算法初识泛型算法只读算法写容器元素的算法重排容器元素的算法定制操作向算法传递函数lambda表达式参数绑定再探迭代器插入迭代器iostream迭代器istream_iterator操作ostream_iterator操作反向迭代器反向迭代器…

Java编程的一些小技巧-----基础语法篇(1)

今天在github上面看到了一个很好的项目&#xff0c;是在Stack Overflow上面点赞数top100的关于Java的回答&#xff0c;看了一些&#xff0c;感觉十分实用&#xff0c;对于新手来说&#xff0c;能加深对Java的认识&#xff0c;同时也能让代码更简洁。所以想写下这系列的博文&…

Java编程的一些小技巧-----基础语法篇(2)

上了一天的课&#xff0c;等下18:30还得上课&#xff0c;趁这个时间先更新一波。 6.如何从一个多层嵌套循环中直接跳出&#xff1f; for (Type type : types) { for (Type t : types2) { if (some condition) { // Do something and break... break; // 这样只退出了最里的…

《C++ Primer》学习笔记(十二):动态内存

《C Primer》学习笔记&#xff08;十二&#xff09;&#xff1a;动态内存动态内存与智能指针shared_ptr内存耗尽shared_ptr与new结合使用智能指针和异常unique_ptrweak_ptr动态数组allocator类使用标准库设计文本查询程序练习程序用堆来存储动态分配的对象&#xff0c;当动态对…

Java编程的一些小技巧-----基础语法篇(3)

继续昨天的话题&#xff0c;越看到后面越吃力啊&#xff0c;感觉都理解一点&#xff0c;但却只是停留在表面&#xff0c;唉&#xff0c;虽然每篇文章只更新五个问题&#xff0c;但却要花我几个小时。坚持吧&#xff0c;坚持把每个问题都深入一点&#xff0c;自己也会收获更多。…

《C++ Primer》学习笔记(十三):拷贝控制

《C Primer》学习笔记&#xff08;十三&#xff09;&#xff1a;拷贝控制拷贝、赋值与销毁拷贝构造函数拷贝赋值运算符析构函数三/五法则使用default阻止拷贝拷贝控制和资源管理行为像值的类定义行为像指针的类交换操作对象移动右值引用移动构造函数和移动赋值运算符右值引用和…

Java Web项目运行一直提示ClassNotFoundException

初学JSPServlet&#xff0c;今天在写一个小项目的时候&#xff0c;启动tomcat后&#xff0c;在网页输入地址一直显示ClassNotFoundException 而控制台一直输出java.sql.SQLException: No suitable driver found for jdbc:mysql://127.0.0.1:3306/jdbc 我看了看我之前写的项…