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

目录

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("<标签名>", <具体内容>);

如下:

    @Overrideprotected 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.完成登录功能

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

核心代码:

  @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");// 通过getParamtertry {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.mzph.cn/diannao/23547.shtml

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

相关文章

C++---模板进阶(非类型模板参数,模板的特化,模板分离编译)

我们都学习和使用过模板&#xff0c;而这篇文章我们来将一些更深入的知识。在此之前&#xff0c;我们在使用C编程时可以看到模板是随处可见的&#xff0c;它能支持泛型编程。模板包括函数模板和类模板&#xff0c;我们有的人可能会说是模板函数和模板类&#xff0c;但严格讲这样…

Ripple:使用Wavelet Approximations来加速FHE的Programmable Bootstraps

1. 引言 University of Delaware和Nillion团队的 Charles Gouert、Mehmet Ugurbil、Dimitris Mouris、Miguel de Vega 和 Nektarios G. Tsoutsos&#xff0c;2024年论文《Ripple: Accelerating Programmable Bootstraps for FHE with Wavelet Approximations》&#xff0c;开源…

关于一些优化的知识

1、凸优化&#xff1a;一定可找到全局最优解 非凸优化&#xff1a;一般是局部最优解 2、无约束优化问题求解方法&#xff1a;梯度下降、拟牛顿法、高斯牛顿法、LM算法 3、 解释&#xff0c;就是右边的式子对应于就是当前这个xk这个点基础上朝着pk取走步长为a得到了对应的值&…

vscode运行命令报错:标记“”不是此版本中的有效语句分隔符。

1. 报错问题 标记“&&”不是此版本中的有效语句分隔符。 2. 解决办法 将 terminal 中的 owershell 改成 cmd 就 ok

To C道路越走越夯实,1688彻底变身了?

在偌大的电商市场&#xff0c;消费者都是专业的“掘宝者”&#xff0c;热衷于发现各种新奇商品和采购新通路。 拼多多、1688等平台也正是在这种情况下&#xff0c;成为消费市场的“宠儿”。其中&#xff0c;1688的发展路径较为独特&#xff0c;据天眼查&#xff0c;其为源头厂…

《python-配置》在ubuntu系统上安装pycham并破解

阿丹&#xff1a; 因为ai开发要使用ubuntu系统&#xff0c;整理和总结一下如何在这里安装pycham 官网下载&#xff1a;pycham下载地址 PyCharm: the Python IDE for data science and web development 官网操作流程&#xff1a; 1&#xff0c;点击下载 2、下载其他版本 3、…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第9章——可积性

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 9. 可积性(Integrability) 本章讨论了可积性(integrability)的概念(它不同于积分过程)。研究了反导数(antiderivative&#xff0c;或称原函数)和函数图像下面积之间的关系&#xff0c;然后通过对面积的近似…

应用解析 | 面向智能网联汽车的产教融合解决方案

背景介绍 随着科技的飞速发展&#xff0c;智能网联汽车已成为汽车产业的新宠&#xff0c;引领着未来出行的潮流。然而&#xff0c;行业的高速发展也带来了对高素质技术技能人才的迫切需求。为满足这一需求&#xff0c;推动教育链、人才链与产业链、创新链的深度融合&#xff0…

文件加密软件排行榜前五名|好用的五款文件加密软件分享

你的公司是否存在这些问题&#xff1a; 数据泄露事件常有发生&#xff0c;数据安全的重要性日益凸显&#xff0c;而文件加密软件则是保护数据安全的重要工具。 市场上存在众多文件加密软件&#xff0c;每款都有其独特的特点和优势。 本文将为您分享五款好用的文件加密软件&…

针对多智能体协作框架的元编程——METAGPT

M ETA GPT: M ETA P ROGRAMMING FOR M ULTI -A GENT COLLABORATIVE F RAMEWORK 1.概述 现有的多智能体系统主要面临以下问题&#xff1a; 复杂性处理不足&#xff1a;传统的多智能体系统主要关注简单任务&#xff0c;对于复杂任务的处理能力有限&#xff0c;缺乏深入探索和…

C++中的priority_queue和deque以及适配器

C中的priority_queue和deque 一丶 priority_queue1.1 priority_queue的介绍1.2 priority_queue的使用1.3 priority_queue的模拟实现 二丶 deque2.1 deque的简单介绍2.2 deque的缺陷2.3 为什么要选择deque作为stack和queue的迭代器 三丶 容器适配器3.1 什么是适配器3.2 STL标准库…

GlaDS缘起

题目:Modeling channelized and distributed subglacial drainage in two dimensions 近年来,冰盖表面融化与冰盖动态之间的联系及其对海平面上升的影响引起了广泛关注。特别是格陵兰冰盖的研究显示,表面融水显著影响冰川移动速度,而冰下排水系统对冰川动力学及冰川水文学…

【WP】猿人学_13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

Edge工作区按钮消失了,又出现了

在edge的设置中的自定义工具栏处的显示工作区&#xff0c;打开&#xff0c;右上角就有一个工作区的标志然后就可以进入工作区了

产业,到底需要什么大模型?

[ 产业究竟需要怎样的大模型&#xff1f;关于这个问题&#xff0c;本文作者便提出了他的看法&#xff0c;并总结了产业大模型目前阶段的三点落地挑战。一起来看看&#xff0c;或许可以帮助你更好地理解大模型与行业、与产业的融合。 写下这篇的起因&#xff0c;是前不久的一件事…

[已解决]FinalShell连接CentOS失败:java.net.UnknownHostException: centos

报错&#xff1a; 解决办法&#xff1a; 1.查看Windows:C:\Windows\System32\drivers\etc\ 2.拷贝hosts文件&#xff0c;用记事本打开hosts文件 3.添加主机名centos及对应IP地址&#xff0c;保存并粘贴覆盖C:\Windows\System32\drivers\etc\中的hosts文件 4.打开cmd命令窗口输…

Mac下删除系统自带输入法ABC,正解!

一、背景说明 MacOS 在 14.2 以下的系统存在中文输入法 BUG&#xff0c;会造成系统卡顿&#xff0c;出现彩虹圆圈。如果为了解决这个问题&#xff0c;有两种方法&#xff1a; 升级到最新的 14.5 系统使用第三方输入法 在使用第三方输入法的时候&#xff0c;会发现系统自带的 …

RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,

报错信息如下&#xff1a; Error during startup: {error,{schema_integrity_check_failed,[{table_attributes_mismatch,rabbit_user,[username,password_hash,tags,hashing_algorithm,limits],[username,password_hash,tags,hashing_algorithm]},{table_attributes_mismatch…

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

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

搜索与图论:深度优先搜索

搜索与图论&#xff1a;深度优先搜索 题目描述参考代码 题目描述 参考代码 #include <iostream>using namespace std;const int N 10;int n; int path[N]; bool st[N];void dfs(int u) {// u n 搜索到最后一层if (u n){for (int i 0; i < n; i) printf("%d …