JavaEE——Servlet中的session

news/2024/7/7 19:49:28

之前的博客中提到,cookie是为了浏览器能够在本地保存数据而产生的机制,是在浏览器工作的。而session则是与之对应的,在客户端工作的。一个服务器对应多个客户端,每个客户端都有自己的session,以sessionId为key,session对象为值,存放在内存的哈希表中

session和cookie相关api

HttpRequest

方法功能
HttpSession getSession()在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
Cookie[] getCookies()返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把Cookie 中的格式解析成键值对.

HttpResponse

方法功能
void addCookie(Cookie cookie)把指定的 cookie 添加到响应中

HttpSession类

方法功能
Object getAttribute(String name)返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null.
void setAttribute(String name, Object value)使用指定的名称绑定一个对象到该 session 会话
boolean isNew()判定当前是否是新创建出的会话

cookie类

方法功能
String getName()返回 cookie 的名称。
String getValue()获取与 cookie 关联的值
void setValue(String newValue)设置与 cookie 关联的值。

实例

实现用户登陆界面

login.html

使用form表单,实现用户名和密码的post请求提交

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登陆</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="登陆">
    </form>
</body>
</html>

LoginServlet

获取前端提交的username和password,与正确的username和password进行比较,如果正确就创建会话,将username和123的键值对存入哈希表,然后页面重定向到index,

package login;

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 {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if("123".equals(username) && "1234".equals(password)){
            //创建会话
            HttpSession session = req.getSession(true);
            session.setAttribute("username","123");
            resp.sendRedirect("index");
        } else {
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("用户名或密码错误!");
        }
    }
}

IndexServlet

获取session,如果session为空就退出,否则获取哈希表中username对应的值,将其打印在页面上

package login;

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("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //此处是false表示,如果不存在,就不创建,返回空
        HttpSession session = req.getSession(false);
        resp.setContentType("text/html; charset=utf8");
        if(session == null){
            resp.getWriter().write("尚未登陆!禁止访问!");
            resp.setStatus(403);
            return;
        }
        String username = (String) session.getAttribute("username");
        resp.getWriter().write(username + "欢迎回来!");
    }
}

项目展示

在这里插入图片描述

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/170951.html

相关文章

2.19 emoji符号大全【玩赚小红书】

知乎无法显示全部表情符号&#xff0c;大家可以参考这个网站&#xff1a;&#x1f923; Emoji表情大全&#xff0c;颜文字百科 &#x1f48c; &#x1f603;&#x1f481;表情符号 &#x1f600; &#x1f603; &#x1f604; &#x1f601; &#x1f606; &#x1f605; &…

PySide创建界面关联项目(五) 百篇文章学PyQT

本文章是百篇文章学PyQT的第五篇&#xff0c;本文讲述如何使用PySide创建UI界面&#xff0c;并且关联入PyCharm 新建的项目中成功运行第一个PyQT程序&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、…

STM32F407 电机编码器测量

文章目录一、STM32F407 定时器编码器功能1.1 STM32定时器简介1.2 STM32定时器编码器功能二、带编码器的直流电机三、代码与验证3.1 初始化代码3.2 验证一、STM32F407 定时器编码器功能 1.1 STM32定时器简介 STM32的定时器功能非常强大&#xff0c;根据官方手册&#xff0c;定…

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第一课 | 内置节点

欢迎 ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器,而不用编写代码。 本专栏可以让你更了解ShaderGraph中每个节点的功能,更自如的在做出自己想要的效果。 如果你想学习在unity中如何制作一个特效,如何在unity中让模型更炫酷,那么快来加入这…

基于Prometheus的容器云平台监控架构设计

【导读】为容器云提供良好的监控环境是保证容器服务的高可靠性、高可用性和高性能的重要部分,通过本文能够快速认识当前容器环境下都有哪些监控方案,并对主流的监控方案有一个系统的了解和认识,并详细介绍基于Prometheus的容器云平台监控架构设计。 1 概述 随着容器化的大…

Trie字典树详解

字典树&#x1f4d6;1. 什么是Trie树&#x1f4d6;2. Trie树的一些应用场景&#x1f4d6;3. Trie树的优缺点&#x1f4d6;4. Trie树的节点怎样定义&#x1f4d6;5. 代码实现&#x1f4d6;6. 字典树的优化&#x1f4d6;1. 什么是Trie树 Trie树&#xff0c;又叫字典树&#xff0…

一文详解JVM的内存结构

目录 前言 内存结构 程序计数器 虚拟机栈 本地方法栈 堆内存 方法区 内部组成 前言 Java的JVM解决的问题是跨操作系统问题。程序员只需要专注于代码的编写&#xff0c;这些代码能够在不同的操作系统Mac&#xff0c;Linux和Windows运行的前提是JVM。JVM还提供了垃圾回收机制…

工作中学到的一些小点

1.结构体对齐 记得之前面试的时候被问过这个问题【汗】 这个结构体占多大 struct sExample {char c;int n; };占8字节&#xff0c;问有没有办法让它占5个字节&#xff1f; 有 #pragma pack(push) //保存对齐状态 #pragma pack(1) //设定为1字节对齐struct sExample {char c;…