HTTP请求中的cookie与session(servlet实现登录页面的表单验证)

news2024/11/26 11:52:03

一、cookie 与 session

1)cookie 与 session 的定义

2)相关的servlet中的 方法

二、代码实现 登录页面

1)先用 vscode 编写登录页面

注意文件的路径 在webapp路径下

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- 使用form表单,实现登录效果 -->
  <div>
    <h1 style="text-align: center;">登录页面</h1>
    <form action="login" method="post" style="width: 300px; margin:0 auto">
      <table>
        <tr>
          <td>用户名:</td>
          <td><input type="text" name="username"></td>
        </tr>

        <tr>
          <td>密码:</td>
          <td><input type="password" name="password"></td>
        </tr>

      </table>
      <input type="submit" value="登录" style="width: 100px; height: 30px; margin-left:100px;">
    </form>
  </div>
</body>

</html>

打开smart tomcat 登录网址

2)编写登录 验证form表单逻辑

在maven项目里java目录下,创建LoginServlet的包,用于区分其他的代码

在包里创建 LoginServlet 的类,继承HttpServlet这个类

登录逻辑

package LoginServlet;

import sun.security.jgss.HttpCaller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取http请求(由于post请求是form表单格式,所以可以直接用getParameter获取里面的内容)
        //在读取请求的时候,最好设置字符编码集(否则,如果用户名是中文,那么读取的时候就是乱码)
        req.setCharacterEncoding("utf8");
        String username = req.getParameter("username");//获取用户名
        String password = req.getParameter("password");//获取密码
        //2.验证用户名和密码(一般来说是要从数据库中验证密码)
        //此时为了简单验证,把正确的用户名和密码规定为:zhangsan 和 123456
        //字符串.equals(变量) 这样的写法,可以用于处理 变量为 null的情况,如果用户名或着密码为空,也是登录失败的
        resp.setContentType("text/html;charset=utf8");
        if ("zhangsan".equals(username) && "123456".equals(password)){
            resp.getWriter().write("欢迎" + username + "登录使用!");
        }else{
            //登陆失败
            //给用户返回一个提示
            resp.getWriter().write("登陆失败:用户名或密码错误!");
            return;
        }
        //3.登录成功,会给用户创建一个会话
        // 可以给会话中保存一些自定义的数据,通过Attribute的方式来存储
        HttpSession session = req.getSession(true);//获取不到会自动创建 则如果“当前用户的会话对象”为空(第一次访问时)则创建一个新的会话对象返回
        //此处 Attribute 存储的一些程序员自定义的属性,以 键值对 方式存储
        //存储好了数据后,后续跳转到其他的页面,也随时可以把这个数据从会话中取出来
        session.setAttribute("username",username);
        session.setAttribute("loginTime",System.currentTimeMillis());//获取的是当前的时间戳

        //4.此时登录成功后的相关数据已经存储好,可以跳转到网站页面了
        resp.sendRedirect("index");//重定向到index页面上
    }
}

3)登录后的页面index 的逻辑

 

package LoginServlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Date;

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取到用户对应的会话对象,生成的页面要根据用户信息来构成的
        HttpSession session = req.getSession(false);//获取不到session不会自动创建
        if (session == null){
            //sessionId 不存在,或者 sessionid 没有在hash 表中查到
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("您当前尚未登录!");
            return;
        }
        //2.从会话中拿到之前存储的用户信息
        //getAttribute的返回值是一个Object对象,所以程序员需要手动 强制类型转换
        String username = (String)session.getAttribute("username");
        Long loginTime = (Long) session.getAttribute("loginTime");//时间戳 是一个很长的数 用 long长整型保存
        Date date = new Date(loginTime);//时间戳对于用户来说不容易理解,所以将时间戳转换为 具体的时间,更直观
        //3.生成一个页面,把上述数据显示到页面上
        resp.setContentType("text/html;charset=utf8");
        String respBody = "欢迎您" + username + "!上次登录时间为" + date;
        resp.getWriter().write(respBody);
    }
}

 4)抓包验证

三、整个代码逻辑 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03节-51单片机-独立按键模块

1. 独立按键控制LED状态 轻触按键实现原理&#xff1a;按下时&#xff0c;接通&#xff0c;通过金属弹片受力弹动来实现接通和断开。 松开按键 按下之后&#xff1a;就会被连接 同时按下K1和K2时&#xff0c;P2_0,接口所连LED灯才亮。 #include <REGX52.H> void ma…

PCA人脸识别

目录 一、PCA主成分分析 二、PCA人脸识别 三、结果 一、PCA主成分分析 PCA&#xff08;主成分分析&#xff09;是一种非常常用的数据降维技术。它通过线性变换将原始数据变换到一个新的坐标系统中&#xff0c;使得在这个新坐标系统的第一个坐标轴上的数据方差最大&#xff…

Python | Leetcode Python题解之第36题有效的数独

题目&#xff1a; 题解&#xff1a; class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:uni (defaultdict(set), defaultdict(set), defaultdict(set))for i in range(9):for j in range(9):s board[i][j]if s .: continueif s in uni[0][i] or …

uniapp:小白1分钟学会使用webSocket(可无脑复制)

uni.connectSocket() uni.$emit页面通信 项目中使用uni.connectSocket()创建webSocket的总结&#xff0c;代码可无脑复制&#xff0c;直接使用。 1、main.js 引入vuex import store from ./store; Vue.prototype.$store store;vuex中封装webSocket 2、vuex的&#xff1a;index…

SpringBoot整合PDF动态填充数据并下载

目录 目录 一、准备环境 二、iTextPDF介绍 三、步骤 四、访问查看结果 五、源代码参考 一、准备环境 ①下载一个万兴pdf软件 ②准备一个pdf 文件 二、iTextPDF介绍 这是一个用于生成PDF文档的Java库&#xff0c; 文档创建与修改&#xff1a;iTextPDF能够从零开始创建…

数据结构(共享栈

目录 1. 讲解&#xff1a;2. C代码实现&#xff1a;小结&#xff1a; 1. 讲解&#xff1a; 两个指针&#xff0c;一个将0作为栈底&#xff0c;一个将maxsize作为栈底&#xff0c;向里面填充。栈满的判断条件为&#xff1a;S.top0 S.top1 - 1 2. C代码实现&#xff1a; #incl…

2、MATLAB入门常用命令

一、退出和中断 exit和quit&#xff1a;结束MATLAB会话。程序完成&#xff0c;如果没有明确保存&#xff0c;则变量中的数据丢失。 Ctrl c&#xff1a;中断一个MATLAB任务。例如&#xff0c;当MATLAB正在计算或打印时&#xff0c;中断一个任务&#xff0c;但会话并没有结束。…

【Unity】申请D-U-N-S邓氏编码流程

标题 在使用苹果开发者账号的时候&#xff0c;我们需要用到D-U-N-S邓氏编码&#xff0c;那如何申请呢&#xff1f;最近正好帮朋友申请了一个&#xff0c;接下来我来演示一下申请流程。 1.登录苹果开发者账号 登录连接&#xff1a;Apple Developer 没有账号的自己注册一个 2…

2024上海国际特种电子暨军民两用技术展览会

2024上海国际特种电子暨军民两用技术展览会 2024 Shanghai International Special Electronics and Military Civilian Dual Use Technology Exhibition 时间&#xff1a;2024年11月18日-20日 地点&#xff1a;上海新国际博览中心 详询主办方陆先生 I38&#xff08;前三位…

数据可视化-ECharts Html项目实战(12)

在之前的文章中&#xff0c;我们深入学习ECharts特殊图表中的矩形树图以及Echarts中高级功能的多图表联动。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数…

Linux标准c库操作(4.15)

fopen函数“const char *mode”参数选项。 结果&#xff1a; 标准库c写入结构体到文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in…

L2-2 病毒溯源 坑点

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而这些变异的病毒又可能被诱发突变产生第二代变异&#xff0c;如此继续不断变化。 现给定一些病毒之间的变异关系&#xff0c;要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的&a…

【Java框架】Spring框架(四)——Spring中的Bean的创建与生命周期

目录 SpringBean的创建步骤后置处理器(PostProcessor)BeanFactoryPostProcessorBeanPostProcessorInstantiationAwareBeanPostProcessorpostProcessBeforeInstantiationpostProcessAfterInstantiationpostProcessProperties SmartInstantiationAwareBeanPostProcessordetermine…

【Python_PySide6学习笔记(三十六)】基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)

基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox分组框 基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)前言正文1、创建QGroupBox并创建其内部布局2、创建QScrollArea并将QGroupBox设置为其内容3、将QScrollArea添加到主窗口的中心部件的布局中4、完整代码…

HTML的超链接

前言&#xff1a; 如图&#xff0c;我们在浏览网页时经常可以看到这样的字体&#xff08;点击便跳转到了别的地方了&#xff09;&#xff0c;今日就和各位一起学习一下超链接的相关知识。 相关知识1&#xff1a; 超链接的标签为&#xff1a;a ~使用格式为&#xff1a; <a h…

智慧城市可视化,山海鲸引领未来

随着信息技术的迅猛发展&#xff0c;智慧城市已成为城市发展的必然趋势。在这一背景下&#xff0c;山海鲸智慧城市可视化解决方案应运而生&#xff0c;以其独特的可视化技术和智能化管理功能&#xff0c;为城市管理者提供了全新的决策支持手段。 山海鲸智慧城市可视化解决方案…

docker的安装以及docker中nginx配置

机器 test3 192.168.23.103 1机器初始化配置 1.1关闭防火墙&#xff0c;清空防火墙规则 systemctl stop firewalld iptables -F setenforce 01.2部署时间同步 yum install ntp ntpdate -y1.3安装基础软件包 yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c make…

如何访问内网?

在互联网万维网上&#xff0c;我们可以轻松访问各种网站和资源。但是&#xff0c;有时我们需要访问局域网内的资源&#xff0c;例如公司内部的文件共享、打印机等。本文将介绍几种方法&#xff0c;帮助您实现访问内网的需求。 内网穿透技术 内网穿透技术是一种通过互联网将局域…

人工智能论文GPT-3(1):2020.5 Language Models are Few-Shot Learners;摘要;引言;scaling-law

摘要 近期的工作表明&#xff0c;在大量文本语料库上进行预训练&#xff0c;然后针对特定任务进行微调&#xff0c;可以在许多NLP任务和基准测试中取得实质性进展。虽然这种方法在架构上通常是与任务无关的&#xff0c;但仍然需要包含数千或数万示例的针对特定任务的微调数据集…

STM32G431RBT6移植FreeRTOS

引言&#xff1a; 本文专门为参加了蓝桥杯嵌入式赛道的同学准备&#xff0c; 大家可能会有这样一个问题&#xff0c; 比完赛之后&#xff0c; 对于像继续使用STM32G431RBT6学习FreeRTOS的&#xff0c; 发现网上的教程使用的板子基本上都是F1和F4的&#xff0c; 其实呢&#xff…