Servlet--会话管理

2023-11-16

默认情况下,一个Web服务器是无法区分一个HTTP请求是否为第一次访问.

例如,一个Web邮件应用要求用户登录后才能查看邮件,因此,当用户输入了相应的用户名和密码后,应用不应该再次提示需要用户登录,应用必须记住哪些用户已经登录.即应用必须能管理用户的会话.

这里阐述四种不同的状态保持技术:URL重写,隐藏域,cookies和HTTPSession对象.

URL重写

URL重写是一种会话跟踪技术,它将一个或多个token添加到URL的查询字符串中,每个token通常为key=value形式,如: url?key_1 = value_1&key_2 = value_2 .

注意,URL和token间用问号(?)隔开,token间用与号(&).

URL重写使用于tokens无需在太多的URL间传递的情况下,然而它有如下的限制:

  • URL在某些浏览器上最大长度为2000字符.
  • 若要传递值到下一个资源时,需要将值插入到链接中,换句话说,静态页面很难传值.
  • URL重写需要在服务端上完成,所有的链接必须带值,因此当以个页面存在很多链接时,处理过程会是一个不小的挑战.
  • 某些字符,例如空格,与和问号等必须用base64编码.
  • 所有的信息都是可见的,某些情况下不太合适.

因此存在如上限制,URL重写仅适用于信息仅在少量页面间传递,且信息本身不隐藏.

示例:

import com.sun.deploy.net.HttpResponse;

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 java.io.IOException;
import java.io.PrintWriter;
import java.io.WriteAbortedException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "CityServletDemo",urlPatterns = "/c")
public class CityServletDemo extends HttpServlet {
    private List<String> londonList,parisList;
    @Override
    public void init() throws ServletException {
        londonList = new ArrayList<String>();
        londonList.add("London Eye");
        londonList.add("Big Ben");
        londonList.add("Tower of London");

        parisList = new ArrayList<String>();
        parisList.add("Eiffel Tower");
        parisList.add("The Louvre");
        parisList.add("Champs Elysees");
    }

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

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String city = request.getParameter("city");
        System.out.println(city);
        try {
            if(!city.isEmpty() &&(city.equals("London")||city .equals("Paris"))){
                showCity(response,city);
            }else{
                showMain(response);
            }
        }catch (NullPointerException e){
            showMain(response);
        }

    }

    private void showMain(HttpServletResponse response) {
        try {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.print("<!DOCTYPE html>\n" +
                    "<html lang=en>\n" +
                    "<head>\n" +
                    "    <meta charset=UTF-8>\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "    <p>Please select a city:</p>\n" +
                    "    <p><a href='?city=London'>London</a></p>\n" +
                    "    <p><a href='?city=Paris'>Paris</a></p>\n" +
                    "</body>\n" +
                    "</html>");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

        }

    }

    private void showCity(HttpServletResponse response,String city) {
        List<String> list = null;
        if (city.equals("London") ){
            list = londonList;
        }else{
            list = parisList;
        }

        try {
            PrintWriter writer = response.getWriter();
            writer.print("<!DOCTYPE html>\n" +
                    "<html lang=\"en\">\n" +
                    "<head>\n" +
                    "    <meta charset=\"UTF-8\">\n" +
                    "</head>\n" +
                    "<body>\n" +
                    "    <p>Top 10 Tourist Attractions:</p>\n"
                   );
            for (String s : list) {
                writer.print("<p>"+s+"</p>");
            }
            writer.print( " \n" +
                    "</body>\n" +
                    "</html>");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

隐藏域

使用隐藏域来保护状态类似于URL重写技术,但不是将值附加到URL上,而是放到HTML表单的隐藏域中.当表单提交时,隐藏域的值也同时提交到服务器端.隐藏域技术仅当网页有表单时有效.该技术相对于URL重写的优势在于:没有字符数限制,同时无须额外的编码.但该技术同URL重写一样,不适合跨越多个界面.

Cookies

URL重写和隐藏域仅适合保存无需跨越太多页面的消息.如果需要在多个页面间传递信息,则以上两种技术实现成本高昂,因为你不得不在每个页面都进行相应的处理.幸运的是Cookies技术可以帮助我们.

Cookies是一个很少的信息片段,可自动地在浏览器和Web服务器间交互,因此cookies可存储在多个页面间传递的信息.Cookie作为HTTP header的一部分,其传输由HTTP协议控制.此外,你可以控制cookies的有效时间.浏览器通常支持每个网站高达20个cookies.

Cookies的问题在于用户可以通过改变其浏览器设置来拒绝接受cookies.

要使用cookies,需要熟悉javax.servlet.http.Cookie类以及HttpServletRequeset和HttpServletResponse两个接口.

可以通过传递name和value两个参数给Cookie类的构造函数来创建一个cookies:

Cookie cookie = new Cookie(name,value);

创建完一个Cookie对象后,你可以设置domain,path和maxAge属性.其中maxAge属性决定cookie何时过期.

要讲cookie发送到浏览器,需要调用HttpServletResponse的add方法:

response.addCookie(cookie);

浏览器在访问统一Web浏览器时,会将之前收到的cookie一并发送.

此外,cookies也可以通过客户端的javascript脚本创建和删除.

服务器端若要读取浏览器提交的cookie,可以通过HttpServletRequest接口的getCookies方法,该方法返回一个Cookie数组,若没有cookies则返回null.如下是查询一个名为maxRecords的cookie的示例:

Cookie maxRecordsCookie = null;
 Cookie[] cookies = request.getCookies();
 if (cookies != null){
     for (Cookie cookie : cookies) {
         if (cookie.getName().equals("maxRecords")){
             maxRecordsCookie = cookie;
             break;
         }
     }
 }

目前,还没有类似于getCookieByName的这样的方法来帮助简化工作.此外也没有直接的方法来删除一个cookie,你只能创建一个同名的cookie,并将maxAge属性设置为0,并添加到HttpServletResquest接口中.如:

Cookie cookie = new Cookie("name","");
cookie.setMaxAge(0);
response.addCookie(cookie);

HttpSession对象

在所有的会话跟踪技术中,HttpSession对象是最强大的和最通用的.一个用户可以有且最多有一个HttpSession,并且不会被其他用户访问到.

HttpSession对象在用户第一次访问网站的时候自动被创建,你可以通过调用HttpServletRequest的getSession方法获取该对象.getSession有两个重载方法:

HttpSession getSession();//返回当前的HttpSession,若当前没有则创建一个新的返回.
HttpSession getSession(boolean var1);//false:返回当前HttpSession,若不存在则,返回null;true与无参数时一样.

可以通过HttpSession的setAttribute方法将值放入HttpSession

void setAttribute(String var1, Object var2);//若传入的name参数此前已用过则会用新值覆盖旧值

请注意,不同于URL重写,隐藏域或cookie,放入到HttpSession的值,是存储在内存中,因此不要网HttpSession中放入太多的对象或大对象.尽管现代的Servlet容器在内存不够用的时候会将保存在HttpSession的对象转储到二级存储上,但这样有性能问题,因此小心存储.

此外,放到HttpSession的值,不限于String类型,可以是任意实现java.io.Serializable的java对象,当然也可以将不支持序列化的对象放入HttpSession,只是这样,当Servlet容器视图序列化的时候会失败并报错.

void setAttribute(String var1, Object var2);//返回之前放入的对像.
Enumeration<String> getAttributeNames(); //迭代访问保存在HttpSession中的所有值

注意,所有保存在HttpSession的数据不会发送到客户端,不同于其他会话管理技术,Servlet容器为每个HttpSession生成唯一标识,并将该标识发送给服务器,或创建一个名为JSEEIONID的cookie,或者在URL后加一个名为jsessionid的参数.在后续的请求中,浏览器会将标识提交给服务器,这样服务器就可以识别该请求是由哪个用户发起.Servlet容器自动选择一种方式传递会话标识.

String getId();//可以通过HttpSession的getId方法来读取该标识

此外,HttpSession还定义了一个invalidate的方法.该方法强制会话过期,并清空其保存的对象.默认情况下,HttpSession会在用户不活动一段时间后自动过期,该时间可以通过部署描述符的session-timeout元素配置,若设置为30,则绘画对象会在用户最后一次访问30分钟后过期,如果部署描述符没有配置,则该值取决于Servlet容器的设定.大部分情况下,应该主动销毁无用的HttpSession,以便释放响应内存.

可以调用HttpSession的getMaxInactiveInterval方法查看会话多久会过期.该方法返回一个数字类型,单位为秒.调用setMaxInactiveInterval方法来单独对某个HttpSession设定其超时时间.

void setMaxInactiveInterval(int var1); //若var1=0,则永不过期,这样HttpSession所占用的内存将永不释放,直到应用重加载或Servlet容器关闭.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet--会话管理 的相关文章

  • php 随机生成指定金额范围内的随机数

    function random bag money total personal num min money money total 20 personal num 19 min money 1 money right money tota
  • Interceptor拦截器的使用

    1 创建配置类 Configuration public class WebConfig implements WebMvcConfigurer Autowired private AuthInterceptor authIntercept
  • JSP、JSTL标签

  • Xception论文解读

  • Codeup(云效)手把手教部署SpringCloud项目到私有主机

    博主介绍 小黄鸭技术 擅长领域 Java 实用工具 运维 系列专栏 开发工具 Java之路 八股文之路 如果文章写作时有错误的地方 请各位大佬指正 一起进步 欢迎大家点赞 收藏 评论 支持博主 开通云效 上传代码仓库 配置SSH公钥或者是H
  • 什么是servlet?servlet有什么用?

    servlet概述 什么是servlet servlet有什么用 servlet是java编写的服务器端的程序 运行在web服务器中 作用 接收用户端发来的请求 调用其他java程序来处理请求 将处理结果 返回到服务器中 servlet的生
  • Cannot forward after response has been committed问题解决及分析

    通过TOMCAT把系统启动 可以正常登陆门户 登陆进去选择子系统的时候点击登陆的时候 可是去又回到了登陆界面 如此反复就是不能够进入子系统 查看后台报的错误 Cannot forward after response has been co
  • 【往届均已检索】2023年控制理论与应用国际会议(ICoCTA 2023)

    往届均已检索 2023年控制理论与应用国际会议 ICoCTA 2023 重要信息 会议网址 www icocta org 会议时间 2023年10月20 22日 召开地点 福建 厦门 截稿时间 2023年8月30日 录用通知 投稿后2周内
  • 判断List、Map集合是否为空的方法

    在Java中 判断集合是否为空有几种方法 以下是其中的一些 1 使用List isEmpty 方法 例如 List
  • 在springboot 中配置使用servlet

    文章目录 1 前言 2 servlet 3 springboot配置 4 启动项目 5 UrlMapping设置 6 Filter 7 Listener 8 总结 1 前言 还记得 说到web项目 最早接触的就是servlet 实际上SSH
  • 手把手教你使用Python网络爬虫获取基金信息

    一 前言 前几天有个粉丝找我获取基金信息 这里拿出来分享一下 感兴趣的小伙伴们 也可以积极尝试 二 数据获取 这里我们的目标网站是某基金官网 需要抓取的数据如下图所示 可以看到上图中基金代码那一列 有不同的数字 随机点击一个 可以进入到基金
  • Get,Post请求中文乱码问题有效解决方法

    对于做Java WEB项目同学来说 中文乱码问题是一个经常遇到而又非常头痛的问题 而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程 至于出现乱码的原因不是本文的关注的重点 想了解的朋友可以参考 http zhaomin819111
  • mysql 5.6 安装流程

    一 首先解压安装包到指定路径 解压路径不可为中文 二 配置环境变量 我是windows11 1 1 2 3 4 5 6 6 全部点击确定 三 更改my ini 这两条路径更改为与环境变量相同路径 四 运行cmd 1 2 输入mysqld i
  • 定义类数组

    编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toString 方法显示所有属性 3 在测试类中定义学生数组 长度为4 分别给数组每个元素赋值 然后循环调用
  • Servlet+JDBC实战开发书店项目讲解第五篇:购物车实现

    Servlet JDBC实战开发书店项目讲解第五篇 购物车实现 引言 在之前的几篇博客中 我们讲解了如何使用Servlet和JDBC开发一个简单的书店管理系统 在本文中 我们将深入探讨购物车的实现 这是一个关键功能 允许用户将所需图书添加到
  • Java代码判断当前操作系统是Windows或Linux或MacOS

    package com magic system public class SystemUtils 判断操作系统是否是 Windows return true 操作系统是 Windows false 其它操作系统 public static
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • java 常见的异常大集合

    算术异常类 ArithmeticExecption 空指针异常类 NullPointerException 类型强制转换异常 ClassCastException 数组负下标异常 NegativeArrayException 数组下标越界异
  • IDEA找不到程序包 和 request.getServletContext()报错Cannot resolve method ‘getServletContext()的解决方法

    重新装了idea和down了项目却一直报错 在调用request getServletContext 的方法时一直报Cannot resolve method getServletContext 的错误 网上查了好多方法 大多数都是在说是s
  • JavaWeb——第五章 Servlet

    第五章 Servlet 一 Servlet简介 1 1 动态资源和静态资源 1 2 Servlet简介 二 Servlet开发流程 2 1 目标 2 2 开发过程 三 Servlet注解方式配置

随机推荐

  • 1. VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方案

    引起此错误一般是因为运行库路径设置错误 导致找不到头文件 afxres h 解决方案 1 运行VC 选择 工具 按钮 选择 选项 如图 VC6 0致命错误
  • LS1028使用原生RGMII软件修改方案

    LS1028的网络拓扑结构 forlinx的开发板目前只做了五路网口 原生的RGMII并没有配置出来 默认将相关引脚功能用作了音频信号 若将该引脚功能用作了RGMII 音频功能就不能使用了 本人主要介绍软件上的修改 对于硬件原理部分是有硬件
  • bat删除文本文件每行前几个字符

    echo off set fn a txt for f usebackq delims i in fn do echo i gt con set h i setlocal enabledelayedexpansion echo h 4 en
  • 【预测模型-RBF预测】基于RBF神经网络实现腐蚀失重数据预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • windows版docker安装运行nacos配置连接数据库

    1 docker安装nacos 下载镜像 docker pull nacos nacos server 下载加载完成之后查看本地镜像 看看拉到本地没有 docker images 启动镜像 docker run d p 8849 8848
  • Mybatis学习笔记--1:先跑起来再说

    MyBatis 本是apache的一个开源项目iBatis 2010年这个项目由apache software foundation 迁移到了google code 并且改名为MyBatis 是一个基于Java的持久层框架 无论是Mybat
  • [诗歌] 断章

    你站在桥上看风景 看风景的人在楼上看你 明月装饰了你的窗子 你装饰了别人的梦 转载至 http baike baidu com link url CryedmfRUvN f04J9seKNbNNojxFQ4FmvF2 P7scQmAQWGq
  • 微信小程序静态页面的实现

    项目地址 github 前段时间微信出了个小程序 我也学习了一下 自己实现了一个小程序 当然里面都是静态页面 并无数据的操作 要开发小程序就得用微信的开发工具了 它现在不限制用户是否有Appid都可以下载来使用了 先上这个小程序的效果图 图
  • 随机颜色(微信小程序)

    随机颜色 function getRandomColor let rgb for let i 0 i lt 3 i let color Math floor Math random 256 toString 16 color color l
  • 数据结构静态顺序表

    顺序表 用一段地址连续存储单元依次存储数据元素的线性结构 seqlist h pragma once 防止头文件重复包含 define MAX SIZE 10 include
  • 苹果电脑升降级MacOS 11-13.x系统安装包

    macOS 13 Ventura 具有许多功能 包括 Stage Manager 和更新的 Spotlight 搜索 目前 苹果已经发布了正式版本 支持机型 iMac 2017 及后续机型 iMac Pro MacBook AIr 2018
  • 《九》TypeScript 中的内置工具

    TypeScript 内置了很多类型工具 来辅助进行类型转换 Partial
  • js获取获取上个月、当月、下个月 第一天与最后一天

    开发中的一个小需求 用js获取获取上个月 当月 下个月 第一天与最后一天 直接上代码 获取上个月 当月 下个月 第一天与最后一天 param val 传值 gt 1 2 3 param specificDate 传入日期 gt 2020 1
  • Java不指定具体数据库名,建立Mysql连接

    碰到个需求 即只提供IP地址 需要获取所有的数据库名 以及各个数据库的详细信息 以下内容为转载 感谢作者 本文是答疑文章 有朋友提出 为什么java建立连接 必须要指定数据库 不能像PHP那样连接数据库后再选择数据库吗 答案是肯定的 能 下
  • QML使用loader加载qml文件到QML

    转自 http blog chinaunix net uid 26126915 id 4366840 html QML的Loader元素经常备用来动态加载QML组件 可以使用source属性或者sourceComponent属性加载 这个元
  • 跨vlan通信-----单臂路由技术

    跨vlan通信 单臂路由技术 实验目标 1 实现跨vlan通信 为什么要使用vlan 1 提高性能 同一个广播域发送广播 造成网络堵塞 2 提高安全性 同一广播域中 机器设备过多 安全性降低 实验网络拓扑 pc1 pc2 pc3 pc4 V
  • Elastic Stack简介及es简单操作

    如果你没有听说过 Elastic Stack 那你一定听说过 ELK 实际上 ELK 是三款软件的简称 分别是 Elasticsearch Logstash Kibana 组成 在发展的过程中 又有新成员 Beats 的加入 所以就形成了
  • M2后日谈

    团队成员的简介 按照字母表序 韩佳胤 http www cnblogs com yinee 黄杨 http www cnblogs com skyjoker 林璐 http www cnblogs com linlu1142 刘俊伟 htt
  • 206.Flink(一):flink概述,flink集群搭建,flink中执行任务,单节点、yarn运行模式,三种部署模式的具体实现

    一 Flink概述 1 基本描述 Flink官网地址 Apache Flink Stateful Computations over Data Streams Apache Flink Flink是一个框架和分布式处理引擎 用于对无界和有界
  • Servlet--会话管理

    默认情况下 一个Web服务器是无法区分一个HTTP请求是否为第一次访问 例如 一个Web邮件应用要求用户登录后才能查看邮件 因此 当用户输入了相应的用户名和密码后 应用不应该再次提示需要用户登录 应用必须记住哪些用户已经登录 即应用必须能管