【JavaEE】使Cookie与Session失效-Servlet上传文件操作-优化表白墙

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 虽然Cookie和Session都是暂时存在的,不久就会被删掉,但是我们要退出登录的时候,就不能等待其自然消除了~

2.2 前端设计


这个页面几乎照搬登录页面,只是增加了一些元素罢了~

用的css也直接用logIn.css和common.css

不包含js代码:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>注册页</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <link rel="stylesheet" href="common.css" />
    <link rel="stylesheet" href="logIn.css" />
    <style>
      #i {
        transition: all 0.618s;
        opacity: 61.8%;
      }
      #i:hover {
        opacity: 100%;
      }
    </style>
  </head>
  <body>
    <div class="navigation">
      <!-- 头像 -->
      <img
        src="https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300"
        alt="未登录"
      />
      <div class="title">未登录</div>
      <div class="space"></div>
      <a href="login.html" onclick="remove()">登录</a>
    </div>
    <!-- 登录页面 -->
    <div class="login-Container">
      <div class="dialog">
        <h3>注册</h3>
        <form
          target="_blank"
          action="reg"
          method="POST"
          enctype="multipart/form-data"
        >
          <div id="fileImage">
            <input id="i" type="button" value="请上传头像" onclick="judge();" />
            <input type="file" name="file" style="display: none" />
            <div id="conf">
              <input
                type="submit"
                value="确认"
                id="co"
                onclick="alert(
                '如果你需要上传头像,则需要注意以下几点\n' +
                  '1. 点击右侧的确认按钮后,此用户名将无法更改头像!\n' +
                  '2. 用户名应为英文字符,否则虽然注册成功但是头像无法与您进行匹配!\n' +
                  '3. 若用户名已被注册过或者已绑定头像,则无法正常注册!\n' + 
                  '4. 只有填写用户名后才能上传图片,只有上传了图片才能点击确认,否则会出错\n'
              );"
              />
            </div>
          </div>
          <div class="row">
            <label for="username">用户名</label>
            <input type="text" id="username" name="name" />
          </div>
        </form>
        <div class="row">
          <label for="password">密码</label>
          <input type="password" id="password" onclick="getImage()" />
        </div>
        <div class="r">
          <input type="submit" id="submit" value="注册" onclick="reg()" />
        </div>
      </div>
    </div>
  </body>
</html>


改动1:头像触摸变化


0c9653b5ab08454ab0503c0e1c750080.png


改动2:头像和按钮


form包住了头像和用户名输入框

在确认的时候做一些提示~

登录 -> 注册


bd5616644df5471eb6832b271b49daf9.png

改动3:对新增元素进行css修饰


#fileImage {
    display: flex;
    justify-content: center;
    align-items: center;
    justify-content: space-around;
}
#conf {
    display: flex;
    justify-content: center;
    align-items: center;
}
#co {
    width: 100px;
    height: 50px;
    color: rgba(255, 255, 255, 0.618);
    font-weight: 900;
    background-color: rgb(251, 114, 153);
    line-height: 50px;
    text-align: center;
    border-radius: 30px;
    border: none;
    transition: all 0.618s;
}
#co:hover {
    background-color: rgb(101, 94, 252);
    color: rgba(0, 0, 0, 0.618);
}
#i {
    width: 200px;
    height: 200px;
    border-radius: 100px;
    background-image: url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300);
    background-repeat: no-repeat;
    background-position: center center;
    background-size: cover;
    border: rgba(251, 114, 153, 0.5) 2px solid;
}


改动4:对其他元素进行微调(不演示)


2.2.1 form提交文件


由于上传文件按钮的样式难以更改,所以我们这里改为一下这种方式

用点击button代替点击上传文件按钮,并且让上传文件按钮消失

331938952dec4f2bb172235359f46359.png

后面搭配一段代码即可


提交form的post请求按钮:


022d8928ee20488ea064b671a6aa931b.png


83c309c2a9ca40b097934c3a446a2488.png


2.2.2 js代码


上传头像要在输入用户名后才能进行(judge函数的非空校验)


8f40ca5dc5e44d8c9c18907523a7ea99.png



function judge() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("请输入名字");
        name.focus();
        return;
    } else {
        javascript: $("input[name='file']").click();
        jQuery("#i").val("");
    }
}


确认按钮为form的方式去提交请求的,所以跟js无关~

点击密码框,显示头像

function getImage() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("请输入名字!");
        name.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };
    jQuery.ajax({
        type: "post",
        url: "image",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body != "No") {
                jQuery("#i").css("background-image", "url(" + body + ")");
                jQuery("#i").val("");
            } else {
                jQuery("#i").css(
                    "background-image",
                    "url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300)"
                );
                jQuery("#i").val("头像");
            }
        },
    });
}


提交注册


8409008e3c98481bafb78704b6405f2d.png

function reg() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("清输入名字!");
        name.focus();
        return;
    }
    if (password.val().trim() == "") {
        alert("清输入密码!");
        password.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };
    jQuery.ajax({
        type: "post",
        url: "save",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body == "No") {
                alert("用户存在");
                name.val("");
                password.val("");
                name.focus();
                jQuery("#i").css(
                    "background-image",
                    "url(https://img1.baidu.com/it/u=4205447136,2730860147&fm=253&fmt=auto&app=138&f=JPEG?w=300&h=300)"
                );
            } else {
                alert("注册成功");
                window.location.href = "login.html";
            }
        },
    });
}



2.2.3 补充:登录页头像显示


原理一致~

d50547f33d714aa0aabaa544d004062f.png


3. 登录页面提供注册与忘记密码按钮

181ee0654e054a728e32aa828f3328ce.png


源码直接在码云看就行了~


3.1 注册按钮

简单的跳转~


88ec76070e7140688fcf9959bf93bba5.png


3.2 忘记密码


忘记密码特别简单,就是直接在数据库里拿到密码,然后返回给输入框~

function toGetPassword() {
    var name = jQuery("#username");
    var password = jQuery("#password");
    if (name.val().trim() == "") {
        alert("请输入是谁!");
        name.focus();
        return;
    }
    var keyValue = {
        name: name.val(),
        password: password.val(),
    };
    jQuery.ajax({
        type: "POST",
        url: "remind",
        contentType: "application/json; charset=utf8",
        data: JSON.stringify(keyValue),
        success: function (body) {
            if (body != "No") {
                jQuery("#password").val(body);
            } else {
                alert("不存在这个用户!");
            }
        },
    });
}



后端中(新的servlet类 Remind):


@WebServlet("/remind")
public class Remind extends HttpServlet {
    ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        resp.setContentType("text/html; charset=utf8");
        String name = user.name;
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Loves?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("mmsszsd666");//这是俺的微信号,欢迎添加,相互学习!
        try {
            Connection connection = dataSource.getConnection();
            String sql = "select * from users where name = '" + name + "';";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            ResultSet set = preparedStatement.executeQuery();
            if(set.next()) {
                resp.getWriter().write(set.getString("password"));
            }else {
                resp.getWriter().write("No");
            }
            set.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}


4. 测试


登录与退出登录测试:

image.png


注册测试:

image.png



重复注册测试:

image.png




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 自然语言处理 API
Session、cookie、token有什么区别?
Session、cookie、token有什么区别?
24 1
|
3天前
|
存储 Java
Servlet 教程 之 Servlet Cookie 处理 1
Servlet教程讲解了如何处理Cookie,用于识别和跟踪用户。服务器发送Cookie(如姓名、年龄)到浏览器,浏览器存储并随后续请求回传。教程涵盖设置、读取和删除Cookie,以及中文编码解码:`URLEncoder.encode()`用于编码,`URLDecoder.decode()`用于解码。
8 0
|
1天前
|
存储
Servlet 教程 之 Servlet Cookie 处理 7
Servlet教程展示了如何删除Cookie。Servlet `DeleteCookies`通过设置setMaxAge()为零,从响应头移除名为&quot;url&quot;的Cookie。当运行此Servlet,之前的ReadCookies返回的url将是null。代码包括检查请求中的Cookie,匹配名称后删除,并显示删除确认信息。
4 0
|
2天前
|
XML 数据格式
Servlet 教程 之 Servlet Cookie 处理 5
Servlet教程展示了如何处理Cookie。创建Cookie涉及构造函数(键值对),设置最大生存周期(如24小时)并将其添加到HTTP响应头。给定示例显示了一个Servlet,它从表单接收名字和URL,编码为Cookie,设置过期时间,然后在响应中发送。HTML表单用于触发Servlet。需在web.xml配置Servlet并用HTML页面调用。
7 1
|
2天前
|
安全 网络安全 数据安全/隐私保护
Servlet 教程 之 Servlet Cookie 处理 3
Servlet教程中的Cookie处理介绍了12个关键方法:设置/获取域名、最大生存时间、名称、值、路径和安全属性,以及评论的设置与获取。这些方法用于在Servlet中创建和管理Cookie的行为,如设定有效期、作用域及安全性。
9 1
|
3天前
|
存储 JavaScript 前端开发
Servlet 教程 之 Servlet Cookie 处理 2
Servlet教程探讨了Cookie处理,用于识别返回用户。服务器发送Cookie到浏览器,浏览器存储并随后续请求发送。处理中文Cookie需用URLEncoder/URLDecoder进行编码解码。设置Cookie通过HTTP头的Set-Cookie字段,包含名值对、过期时间、路径和域。浏览器在到期前保存并自动发送匹配的Cookie。Servlet利用request.getCookies()获取Cookie数组。
8 0
|
4天前
|
存储 安全 前端开发
禁用Cookie后Session还能用吗?
禁用Cookie后Session还能用吗?
13 1
|
4天前
|
Java
Cookie和Session
Cookie和Session
11 0
|
15天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
16 0
|
15天前
|
存储 JSON 安全