Servlet实现会话追踪登录功能(结合JDBC)

news2024/11/27 1:40:00

目录

1.技术要求

2.关于会话Session

生活例子

代码体现

1.存储到session

2.从session中拿出

3.完成登录功能

4.利用Session作追踪

关于jstl应用

关于EL表达式应用

注意

5.测试


1.技术要求

核心:

(1)Servlet项目的搭建

(2)JDBC的连接

(3)基本登录逻辑代码实现

(4)会话Seesion的应用

辅助:

(1)JSP页面中表格编写(html)

(2)JSTL与EL表达式的简单使用(如<c:if>和<c:each>)

2.关于会话Session

在Servlet中进行会话追踪通常涉及使用HTTPSession对象来保存和管理会话数据。对于登录功能,通常的做法是在用户成功登录后,创建一个HttpSession对象,将用户的相关信息存储在HttpSession中,然后将HttpSession的ID存储在用户的浏览器中,通常使用cookie来实现这一点。

生活例子

当我们使用学生卡来介绍Session时,可以类比为学生卡上存储了学生的个人信息,用于识别和管理学生的身份。让我们来看看具体的例子:

假设你是一名学生,学校为每位学生发放了一张学生卡,里面存储了你的姓名、学号、班级等个人信息。这张学生卡可以帮助学校和老师辨认你的身份,管理你的学习和其他事务。

现在我们将学生卡比作Session,在这个类比中:

  1. 登记过程:当你第一次进入学校时,学校登记了你的个人信息(相当于在服务器端创建了一个Session)。这个过程中,你被分配了一个唯一的学生卡号(Session ID),用来标识你的身份。

  2. 使用学生卡:在接下来的学习过程中,你需要频繁使用学生卡来证明自己的身份。老师和学校工作人员可以通过查看你的学生卡(Session ID)来确认你的个人信息(Session中的数据)。

  3. 过期与注销:如果你离开学校或学校识别出你的学生卡有问题,学生卡可能会被注销。类似地,在Web开发中,Session也有过期和失效的时间,一段时间没有活动或者用户注销登录时,Session会被清除。

代码体现

session作为会话,用于识别用户信息,便于在各个页面中(如jsp)和不同的Servlet(get或post请求)中使用,存取session中的属性。因此它是能够允许在不同的Servlet和jsp(jsp也是一种特殊的servlet)中共享的。

代码表现为: 

1.存储到session

req.getSession().setAttribute("<标签名>", <具体内容>);

如下:

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 设置响应内容类型为html或text页面
        resp.setContentType("text/html");
        // 设置响应字符类型识别为UTF-8  即中文
        resp.setCharacterEncoding("UTF-8");
        // 创建学生类集合
        ArrayList<Student> students = new ArrayList<>();

        Student student1 = new Student("张三", 20);

        Student student2 = new Student("李四", 21);

        students.add(student1);

        students.add(student2);
        // 获取HttpSession对象,将集合students存在session中,并打上标签名“students”
        req.getSession().setAttribute("students", students);

    }

如果是在jsp页面中,则为:<% session.setAttribute("<标签名>", <具体内容>);%>

如下:

<%@ page import="com.entity.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>


<%

    Student student = new Student("张三",23);

    Student student1 = new Student("李四", 24);

    ArrayList<Student> students = new ArrayList<>();

    students.add(student);

    students.add(student1);

    System.out.println(students);

    session.setAttribute("students",students);
    // 将数据存储在session中
%>

</body>
</html>
2.从session中拿出

req.getSession().getAttribute("<标签名>");

如下:

        req.getSession().setAttribute("students", students);
        
        req.getAttribute("students");

如在jsp页面中,则为

<% session.getAttribute("<标签名>); %>

如下:

    session.setAttribute("students",students);
    // 将数据存储在session中
    
    session.getAttribute("studenrts");
    // 将数据从session中取出

3.完成登录功能

登录核心逻辑是,用户传来其账号和密码服务器接收后通过和数据库中的用户信息表作比对,判断用户输入的内容是否存在表中,若存在,则说明是该网站的用户;反之则不存在,可以让用户重新登录或注册账号

核心代码:

  @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String username = req.getParameter("username");

        String password = req.getParameter("password");

        // 通过getParamter

        try {
            Connection connection = JDBCUtil.getConnection();

            Statement statement = JDBCUtil.getStatement(connection);

            ResultSet resultSet = statement.executeQuery("select * from user where username = '" + username + "' and password = '" + password + "'");
            
            // 上述过程分别为获取连接、获取statement、执行查询语句、获取结果集

            if(resultSet.next()){ // 如果结果集不为空,则表示查询到用户,将关键信息存在session中允许向其展示内容,跳转到首页
                req.getSession().setAttribute("username",username);
                resp.sendRedirect("/jsp/success.jsp");
            }else{ // 如果结果集为空,则表示未查询到用户,跳转到错误页面或回到登录页面
                resp.sendRedirect("/jsp/error.jsp");
            }


        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }


    }

将上述注册为一个Servlet,可以有两种方式:web.xml中配置或使用WebServlet注解

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
    
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.Demo1.MyServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/zhan</url-pattern>
    </servlet-mapping>

</web-app>

上述两个方式是等价的

4.利用Session作追踪

在上一步中,我们将一个提供正确账号密码的用户信息存储在session中,接下来便可以在任何其它页面中利用session里面的数据作快速判断,是否用户是带着登录信息到达该页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<c:if test="${sessionScope.username==null}">

    <% response.sendRedirect("/jsp/error.jsp"); %>

</c:if>

<c:if test="${sessionScope.username!=null}">

    <h1>你被识别为本网站用户,可查看数据!</h1>

</c:if>


</body>
</html>

上述用到了jstl标签库中的<c:if>以及EL表达式中的${}格式,这个极大程度上方便了java代码和html代码的结合

关于jstl应用

应用jstl标签库,你需要导入两个jar包到WEB-INF中的lib目录下

jstl的下载网址jstl jar包下载

选择该项:

解压文件后,在lib文件夹会获得两个jar包: standard.jar和jstl.jar

需要把这两个jar包导入到项目中,注意:

载入外来包,我们不介意采取:右击项目——Build Path方式,因为这样只是引入了一个jar包的link进来,如果把项目挪动位置或者把jar包删除了,则报错。所以我们推荐直接把要载入的文件复制到:项目——WebRoot\WEB-INF\lib里面,不要忘了把jar包选中——右键——Build Path----Add to Build Path。或直接将lib右键--Add as library,这样做可以让jar包随着项目走,绑在了一起。

关于EL表达式应用

EL表达式不需要引入额外jar包,在jsp页面中体现为"${}"形式,其中较为常用的是${sessionScope.<标签名>}与${requestScope.<标签名>}  其作用分别是取得session和request中对应标签名的数据

注意

有些配置可能会默认不开启EL表达式功能,这时候我们需要用代码显式表达在jsp页面中,告知该页面要启用EL表达式的识别功能

我们只需在jsp页面顶端添加代码即可:

<%@ page isELIgnored="false" %>

5.测试

首先我们未在登录页面进行验证的情况下,直接访问该网址:

此时页面就跳转到了失败页面

接下来我们在登录页面中提交信息

提交后到达核心数据页面

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

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

相关文章

正邦科技(第10天)

这里写目录标题 任务一任务二任务三 任务一 下位机报上来的十进制数据进行解析&#xff1a; 360170 固定报文&#xff0c;一个F对应一个字节&#xff0c;温度值&#xff0c;湿度值&#xff0c;烟雾浓度值是十进制转16进制&#xff0c;告警状态需要高低位移位&#xff0c;然后再…

Apple开发者Identifier唯一身份标识创建

1. 选中Identifiers然后点击加号进入创建页面 2.选择要注册的标识类型 选择类型为App然后点击继续 输入应用描述与BundleID并勾选要开启的功能后点击继续 点击注册标识 注册成功后,会在标识列表中看到

Apple开发者macOS设备与描述文件Profile创建完整过程

安装并打开Apple Configurator 新建描述文件 输入macOS平台的描述文件的相关信息,然后选择证书 选择一个可用证书 存储描述文件 存储成功如下: 使用文本编辑器打开刚才保存的描述文件,找到设备名与UDID

MySQL8.3日志文件占用硬盘空间过大,释放方法

执行 reset master; 即可解决问题&#xff0c;我写了个任务&#xff0c;定期执行 执行后目录效果

Vue3学习记录(第一天)

Vue3学习记录_第一天 背景说明记录Vue3实现响应式前端的反射前端对象的属性赋值Vue3响应式实现过程稿前端移除对象的属性 背景 本次学习主要是看视频学习, 没有跟练, 但是很多知识点感觉又容易忘记. 所以通过笔记的方式输出一下. 说明 估计只能自己看懂, 如果能提供一些其他…

ROS学习记录:自定义消息类型

前言 当我们需要传输一些特殊的数据时&#xff0c;且官方的消息包无法满足需求&#xff0c;我们便可以自己定义一个消息类型。 实验步骤 一、在终端输入cd ~/catkin_ws1/src进入工作空间中src目录 二、输入catkin_create_pkg qq_msgs roscpp rospy std_msgs message_generati…

Docker 基础使用(3) 存储卷

文章目录 存储卷的含义存储卷的分类存储卷的作用存储卷的使用存储卷实际使用案例 ---- MySQL灾难恢复存储卷的局限 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用…

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

Python 可变长参数的魔法:灵活函数设计的秘密

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 什么是可变长参数&#xff1f; 在 Python 中&#xff0c;可变长参数允许你向函数传入任意数量的参数&#xff0c;而无需预先定义它们的个数。这为编写更加灵活和通用的函数提供了可能。可变长参数主要有两种形式&am…

OpenCV的小部件最基本范例

OpenCV也有与PYQT类似的小部件&#xff0c;例如滑块slider。OpenCV可以用与PYQT类似的“信号与槽”方法&#xff0c;也可以在函数中直接查询小部件的值。 import cv2 import numpy as npcv2.namedWindow(Show1) image np.zeros((100, 400, 3), np.uint8) # 创建一个空白内容…

微服务网关Gateway(下)

CSDN 的小伙伴们&#xff0c;大家好呀&#xff0c;我是苍何。 这篇文章我们继续来说下我们项目中用到的微服务网关 Gateway 的技术点。主要涵盖过滤器&#xff0c;限流处理以及黑白名单配置。 过滤器 网关中的过滤器&#xff0c;有点类似 SpringMVC 里面的拦截器 Intercepto…

mysql中 redo日志(上)

大家好。我们知道InnoDB 存储引擎是以页为单位来管理存储空间的&#xff0c;我们进行的增删改查操作其实本质上都是在访问页面。而在真正访问页面之前&#xff0c;需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。那么我们思考一个问题&#xff1a;如果我们只在内…

【漏洞复现】锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞(XVE-2024-2116)

0x01 产品简介 锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务&#xff0c;使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。 0x02 漏洞概述 校园网自助服务系统/selfservice/selfservice…

路由黑洞处理

今天BGP基础实验碰到了路由黑洞 BGP承载于IGP之上&#xff0c;BGP路由天生要递归&#xff0c;才能找出口 在E的BGP去A&#xff0c;下一跳只有B&#xff0c;但是流量走了两条路&#xff0c;c和d BGP路由黑洞&#xff1a; 控制层面可达&#xff0c;数据层面不可达; 路由条目在BG…

阿里云搭建物联网平台+MQTT.fx接入阿里云

文章目录 本篇介绍一、阿里云物联网平台搭建二 、MQTT客户端接入阿里云物联网平台总结 本篇介绍 本篇搭建了阿里云物联网平台&#xff0c;使用MQTT.fx接入阿里云&#xff0c;上传温湿度数据 使用到的软件&#xff1a;阿里云、MQTT.fx 一、阿里云物联网平台搭建 首先创建一个物…

【AI大模型】 应用开发基础

目录 迎接 AGI 时代 什么是 AI&#xff1f; AGI 和AIGC 大模型 AI 能干什么&#xff1f; 大模型落地情况综述 Killer App 没有影 AI 原生待证明 成功落地大模型五要素 大模型是怎样工作的&#xff1f; 通俗原理 略深一点的通俗原理 再深一点点 用好 AI 的核心心法…

C#知识|通过ADO.NET实现应用程序对数据库的查询操作。

哈喽,你好啊,我是雷工! 前边学习了通过ADO.NET实现C#应用程序对数据库的增、删、改操作。 接下来接着学习查询操作,以下为学习笔记。 查询返回有两种类型,一种是单行单列的单一结果,一种是结果集,首先了解查询结果是单行单列结果的写法。 01 查询返回单一结果 以前方的…

【Redis学习笔记04】Jedis客户端(通用命令)

Java客户端操作Redis Java生态丰富&#xff0c;自定义的客户端非常多&#xff0c;常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate&#xff0c;但是对于初学者而言&#xff0c;从Jedis开始入门学习是非常容易上手的&#xff0c;因为Jedis中的API与原生Redis命令高度…

集合进阶相关基础及底层原理

集合体系结构 单列集合&#xff1a; Collenction 每次只能添加一个值&#xff0c;其中红色是接口&#xff0c;蓝色是实现类 图来自黑马程序员网课 List系列集合&#xff1a;添加的元素是有序&#xff0c;可重复&#xff0c;有索引 Set系列集合&#xff1a;添加的元素是…

--- JAVA 多态 ---

多态&#xff0c;顾名思义就时有多种形态&#xff0c;那咋样才嫩共有多种形态呢&#xff0c;再java中就是用不同的对象去调用同一个方法&#xff0c;产生了不同的结果。 看这段代码&#xff0c;我调用的是同一个方法&#xff0c;且只是传入的对象的不同&#xff0c;但是产生了不…