Java中Session的实现

在Java中,Session是一种用于在Web应用程序中跟踪用户状态的机制。它允许服务器在不同的HTTP请求之间存储和检索特定于用户的信息。Session是建立在HTTP协议之上的,它通过在服务器和客户端之间传递一个唯一的标识符来跟踪用户。

下面是对Java中的Session的详细解读:

  1. 概念:Session是一种服务器端的状态管理技术,用于存储和维护特定用户的数据。每个用户在访问Web应用程序时都会被分配一个唯一的Session,并且该Session会在用户访问完成后被销毁。

  2. 建立Session:当用户访问Web应用程序时,服务器会为该用户创建一个Session对象。这通常是在用户首次访问时自动完成的,但也可以通过编程方式手动创建Session。

  3. Session ID:每个Session都有一个唯一的Session ID,它是一个字符串或数值,用于唯一标识该Session。Session ID通常会被存储在用户的浏览器Cookie中,以便在后续的请求中将Session ID发送回服务器。

  4. 存储数据:Session对象提供了一种存储和检索用户数据的方式。在Session中存储的数据可以是任意类型的,例如用户的身份认证信息、购物车内容、用户偏好设置等。存储的数据以键值对的形式存在,可以通过键来访问和修改数据。

  5. 生命周期:Session的生命周期从创建到销毁,通常与用户的访问会话保持一致。Session可以在用户关闭浏览器或一段时间不活动后自动销毁,也可以通过编程方式手动销毁。

  6. 数据共享:Session对象在同一Web应用程序的多个页面之间共享数据。这意味着用户在一个页面中存储的数据可以在其他页面中访问和使用。

  7. 安全性:Session数据通常存储在服务器端,因此比存储在客户端的Cookie更安全。但是,为了确保安全性,应该采取措施来防止Session劫持或会话固定等攻击。

总结:Session在Java中是一种用于跟踪用户状态和存储用户数据的机制。它提供了一种在不同HTTP请求之间保持用户数据的方式,并且允许数据在Web应用程序的多个页面之间共享。Session的使用可以增强Web应用程序的功能和安全性,但在设计和实现时需要注意一些安全问题。

创建一个Web application项目
在这里插入图片描述

在这里插入图片描述

项目结构展示
在这里插入图片描述

在Java中,可以通过HttpServletRequest对象来获取Session对象

HttpSession session = request.getSession();

这段代码是Java中使用Servlet API创建和获取HTTP会话(HTTP Session)的常见方式。

首先,request是一个HttpServletRequest对象,它代表了客户端发起的HTTP请求。getSession()HttpServletRequest类中的一个方法,用于获取与当前请求相关联的HTTP会话。如果会话不存在,则会创建一个新的会话。如果会话已存在,则返回现有的会话。

接下来,session是一个HttpSession对象,它代表了客户端和服务器之间的会话。通过这个对象,可以在请求之间存储和获取特定用户的信息。例如,在一个购物网站中,可以使用会话来跟踪用户的购物车内容或登录状态。

使用session对象,你可以执行各种操作,例如:

  • 存储和获取会话属性:session.setAttribute("key", value)用于将一个属性存储到会话中,session.getAttribute("key")用于获取会话中的属性值。
  • 设置会话超时时间:session.setMaxInactiveInterval(seconds)用于设置会话的非活动超时时间,单位为秒。
  • 使会话无效:session.invalidate()用于使会话无效,从而终止会话并释放相关资源。
session.setAttribute("username", username)

通过调用以上代码将会在当前会话中创建一个名为"username"的属性,并将其值设置为username变量的值。

String username = (String) session.getAttribute("username");

通过调用session.getAttribute(“username”),可以获取在会话中存储的名为"username"的属性的值。然后,这个值被强制类型转换为String类型,并存储在变量username中。

修改web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- 定义第一个Servlet -->
    <servlet>
        <servlet-name>MyServlet</servlet-name> <!-- Servlet的名称 -->
        <servlet-class>com.example.tomcat.MyServlet</servlet-class> <!-- Servlet类的完全限定名 -->
    </servlet>

    <!-- 配置第一个Servlet的映射 -->
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name> <!-- Servlet的名称,与上面的对应 -->
        <url-pattern>/test</url-pattern> <!-- 匹配的URL模式 -->
    </servlet-mapping>

    <!-- 定义第二个Servlet -->
    <servlet>
        <servlet-name>Session1</servlet-name> <!-- Servlet的名称 -->
        <servlet-class>com.example.tomcat.Session1</servlet-class> <!-- Servlet类的完全限定名 -->
    </servlet>

    <!-- 配置第二个Servlet的映射 -->
    <servlet-mapping>
        <servlet-name>Session1</servlet-name> <!-- Servlet的名称,与上面的对应 -->
        <url-pattern>/Session1</url-pattern> <!-- 匹配的URL模式 -->
    </servlet-mapping>

    <!-- 定义第三个Servlet -->
    <servlet>
        <servlet-name>Session2</servlet-name> <!-- Servlet的名称 -->
        <servlet-class>com.example.tomcat.Session2</servlet-class> <!-- Servlet类的完全限定名 -->
    </servlet>

    <!-- 配置第三个Servlet的映射 -->
    <servlet-mapping>
        <servlet-name>Session2</servlet-name> <!-- Servlet的名称,与上面的对应 -->
        <url-pattern>/Session2</url-pattern> <!-- 匹配的URL模式 -->
    </servlet-mapping>

</web-app>

这段XML代码是一个Web应用程序的部署描述符(Deployment Descriptor),通常命名为web.xml。它用于配置和映射Servlet组件。

注释:

  • 第1-3行:XML文档的声明,指定版本和字符编码。
  • 第5-25行:web-app元素是整个Web应用程序的根元素,用于定义Web应用程序的配置信息。
  • 第7-11行:servlet元素用于定义一个Servlet组件。
    • <servlet-name>:指定Servlet的名称。
    • <servlet-class>:指定Servlet类的完全限定名。
  • 第13-17行:servlet-mapping元素用于配置Servlet的映射。
    • <servlet-name>:指定与之关联的Servlet的名称。
    • <url-pattern>:指定匹配的URL模式,当客户端请求的URL与此模式匹配时,将由对应的Servlet处理。

解读:

  • 该部署描述符中定义了三个Servlet组件,分别为MyServletSession1Session2
  • MyServlet通过com.example.tomcat.MyServlet类来实现。
  • Session1通过com.example.tomcat.Session1类来实现。
  • Session2通过com.example.tomcat.Session2类来实现。
  • MyServlet被映射到URL模式/test,当客户端请求的URL匹配该模式时,MyServlet将会被调用。
  • Session1被映射到URL模式/Session1,当客户端请求的URL匹配该模式时,Session1将会被调用。
  • Session2被映射到URL模式/Session2,当客户端请求的URL匹配该模式时,Session2将会被调用。

通过这些配置,Web应用程序可以根据不同的URL模式将请求路由到相应的Servlet组件进行处理

Session1代码

package com.example.tomcat;

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(name = "Session1", value = "/Session1")
public class Session1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // 获取Session对象
        HttpSession session = request.getSession();

        // 从请求参数中获取数据
        String username = request.getParameter("username");
        System.out.println("Username from request parameter: " + username);

        // 保存数据到Session中
        session.setAttribute("username", username);

        System.out.println("Username saved to session: " + username);

        // 重定向到另一个Servlet或页面
        response.sendRedirect("Session2?username=" + username);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

Session2代码

package com.example.tomcat;

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(name = "Session2", value = "/Session2")
public class Session2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // 获取Session对象
        HttpSession session = request.getSession();

        // 从Session中获取保存的数据
        String username = (String) session.getAttribute("username");
        if (username != null) {
            System.out.println("Username found in session: " + username);
        } else {
            System.out.println("No username found in session.");
        }

        // 输出保存的数据
        if (username != null) {
            response.getWriter().println("Username: " + username);
        } else {
            response.getWriter().println("No username found in session.");
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

Session测试
在这里插入图片描述

点击Session1跳转页面
在这里插入图片描述

再打开一个新的标签页复制http://localhost:8080/Session_war_exploded/Session2
在这里插入图片描述

再打开一个新的浏览器测试同样复制http://localhost:8080/Session_war_exploded/Session2
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值