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

如下:

    @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.测试

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

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

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

提交后到达核心数据页面

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛变涡流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值