重定向地址_JavaWeb - Servlet:重定向和转发,状态管理

b35b29bf2c617a9755e35b64af8ad6e0.png

Servlet + JDBC 应用

在 Servlet 中可以使用 JDBC 技术访问数据库,常见功能如下:

  • 查询 DB 数据,然后生成显示页面,例如:列表显示功能。
  • 接收请求参数,然后对 DB 操作,例如:注册、登录、修改密码等功能。

为了方便重用和便于维护等目的,经常会采用 DAO(Data Access Object)模式对数据库操作进行独立封装。

DAO 工厂(工厂模式):工厂类封装了对象的创建细节,为调用者提供符合要求的对象。

重定向和转发

重定向的概述

概念

首先客户浏览器发送 http 请求,当 web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 url 是新的 location 地址,服务器根据此请求寻找资源并发送给客户。

实现

实现重定向需要借助 javax.servlet.http.HttpServletResponse 接口中的方法:

void sendRedirect(String location) 使用指定的重定向位置 URL 向客户端发送临时重定向响应

原理

当执行添加页面功能时,浏览器发送 add.do 请求给 Tomcat 服务器;

Tomcat 服务器的 AddServlet 收到 add.do 请求后,先访问数据库 DB 执行插入新数据的操作,然后发送 302 状态码及重定向的新地址 Location: list.do 信息到浏览器;

浏览器根据新地址发送 list.do 请求给 Tomcat 服务器;

Tomcat 服务器的 ListServlet 收到 list.do 请求后,先访问数据库 DB 获取 list 数据,然后发送 200 状态码及 list 数据到浏览器;

浏览器根据 list 数据展示页面。

特点

重定向之后,浏览器地址栏的 URL 会发生改变。

重定向过程中会将前面 Request 对象销毁,然后创建一个新的 Request 对象。

重定向的 URL 可以是其它项目工程。

转发的概述

转发的概念

一个 Web 组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个 Web 组件继续处理,转发的各个组件会共享 Request 和 Response 对象。

转发的实现

  • 绑定数据到 Request 对象

Object getAttribute(String name) 将指定属性值作为对象返回,若给定名称属性不存在,则返回空值

void setAttribute(String name,Object o) 在此请求中存储属性值

  • 获取转发器对象

RequestDispatcher getRequestDispatcher(String path) 返回一个 RequestDispatcher 对象,该对象充当位于给定路径上的资源的包装器

  • 转发操作

void forward(ServletRequest request, ServletResponse response) 将请求从一个 servlet 转发到服务器上的另一个资源(Servlet、JSP文件或HTML文件)

转发的特点

转发之后浏览器地址栏的 URL 不会发生改变。

转发过程中共享 Request 对象。

转发的 URL 不可以是其它项目工程。

重定向和转发的比较

  1. 重定向访问服务器两次,转发只访问服务器一次。
  2. 转发页面的 URL 不会改变,而重定向地址会改变。
  3. 转发只能转发到自己的 web 应用内,重定向可以重定义到任意资源路径。
  4. 转发过程中共享 request 对象;而重定向会产生一个新的 request,不能共享 request 域信息与请求参数。
  5. 转发相当于服务器内部方法调用,转发后面的代码仍然会执行;而重定向操作是方法执行完成之后才进行。
  6. 无论是 RequestDispatcher.forward 方法,还是 HttpServletResponse.sendRedirect 方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中移除。

Servlet 线程安全

服务器在收到请求之后,会启动一个线程来进行相应的请求处理。

默认情况下,服务器为每个 Servlet 只创建一个对象实例。当多个请求访问同一个 Servlet 时,会有多个线程访问同一个 Servlet 对象,此时就可能发生线程安全问题。

多线程并发逻辑,需要使用 synchronized 对代码加锁处理,但尽量避免使用。

状态管理

Web 程序基于 HTTP 协议通信,而 HTTP 协议是”无状态”的协议,一旦服务器响应完客户的请求之后,就断开连接,而同一个客户的下一次请求又会重新建立网络连接。

服务器程序有时是需要判断是否为同一个客户发出的请求,比如客户的多次选购商品。因此,有必要跟踪同一个客户发出的一系列请求。

把浏览器与服务器之间多次交互作为一个整体,将多次交互所涉及的数据保存下来,即状态管理。

多次交互的数据状态可以在客户端保存,也可以在服务器端保存。

状态管理主要分为两类:

  • 客户端管理 - 将状态保存在客户端。基于 Cookie 技术实现。
  • 服务器管理 - 将状态保存在服务器端。基于 Session 技术实现。

Cookie 技术

基本概念

Cookie 表示客户端以“名-值”形式进行保存的一种技术。

浏览器向服务器发送请求时,服务器将数据以 Set-Cookie 消息头的方式响应给浏览器,然后浏览器会将这些数据以文本文件的方式保存起来。

当浏览器再次访问服务器时,会将这些数据以 Cookie 消息头的方式发送给服务器。

相关的方法

  • 使用 javax.servlet.http.Cookie 类的构造方法实现 Cookie 的创建。

Cookie(String name, String value) 根据参数指定数值构造对象

  • 使用 javax.servlet.http.HttpServletResponse 接口的成员方法实现 Cookie 的添加。

void addCookie(Cookie cookie) 添加参数指定的对象到响应

  • 使用 javax.servlet.http.HttpServletRequest 接口的成员方法实现 Cookie 对象的获取。

Cookie[] getCookies() 返回此请求中包含的所有 Cookie 对象

  • 使用 javax.servlet.http.Cookie 类的构造方法实现 Cookie 对象中属性的获取和修改。

String getName() 返回此 Cookie 对象中的名字

String getValue() 返回此 Cookie 对象的数值

void setValue(String newValue) 设置 Cookie 的数值

Cookie 的生命周期

  • 默认情况下,浏览器会将 Cookie 信息保存在内存中,只要浏览器关闭,Cookie 信息就会消失。
  • 如果希望关闭浏览器后 Cookie 信息仍有效,可以通过 Cookie 类的成员方法实现。

int getMaxAge() 返回cookie的最长使用期限(以秒为单位)

void setMaxAge(int expiry) 设置cookie的最长保留时间(秒)

Cookie 的路径问题

  • 浏览器在访问服务器时,会比较 Cookie 的路径与请求路径是否匹配,只有匹配的 Cookie 才会发送给服务器。
  • Cookie 的默认路径等于添加这个 Cookie 信息时的组件路径,例如:/项目名/目录/add.do 请求添加了一个 Cookie 信息,则该 Cookie 的路径是 /项目名/目录。
  • 访问的请求地址必须符合 Cookie 的路径或者其子路径时,浏览器才会发送 Cookie 信息。如果访问请求地址为 项目名/test.html,则路径为 项目名 的 Cookie 信息会被发送到服务器;如果访问请求地址为 项目名/目录/test.html,则路径为 项目名 和 项目名/目录 的 Cookie 信息会被发送到服务器。

void setPath(String uri) 设置 Cookie 的路径信息

Cookie 的特点

Cookie 技术不适合存储所有数据,程序员只用于存储少量、非敏感信息,原因如下:

  • 将状态数据保存在浏览器端,不安全
  • 保存数据量有限制,大约 4 KB 左右
  • 只能保存字符串信息
  • 可以通过浏览器设置为禁止使用

Session 技术

基本概念

Session 是用来维护一个客户端和服务器关联的一种技术。

浏览器访问服务器时,服务器会为每一个浏览器都在服务器端的内存中分配一个空间,用于创建一个 Session 对象,该对象有一个 id 属性且该值唯一,我们称为 SessionId,并且服务器会将这个 SessionId 以 Cookie 方式发送给浏览器存储。

浏览器再次访问服务器时会将 SessionId 发送给服务器,服务器可以依据 SessionId 查找相对应的 Session 对象。

相关的方法

  • 使用 javax.servlet.http.HttpServletRequest 接口的成员方法实现 Session 的获取。

HttpSession getSession() 返回此请求关联的当前 Session,若此请求没有则创建一个

  • 使用 javax.servlet.http.HttpSession 接口的成员方法实现判断和获取。

boolean isNew() 判断是否为新创建的 Session

String getId() 获取 Session 的编号

  • 使用 javax.servlet.http.HttpSession 接口的成员方法实现属性的管理。

Object getAttribute(String name) 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定,则返回空值

void setAttribute(String name, Object value) 使用指定的名称将对象绑定到此会话

void removeAttribute(String name) 从此会话中删除与指定名称绑定的对象

Session 的生命周期

  • 为了节省服务器内存空间资源,服务器会将空闲时间过长的 Session 对象自动清除掉,服务器默认的超时限制一般是 30 分钟。
  • 使用 javax.servlet.http.HttpSession 接口的成员方法实现失效实现的获取和设置。

int getMaxInactiveInterval() 获取失效时间

void setMaxInactiveInterval(int interval) 设置失效时间

  • 可以配置 web.xml 文件修改失效时间。
30

Session 的特点

数据比较安全。

能够保存的数据类型丰富,而 Cookie 只能保存字符串。

能够保存更多的数据,而 Cookie 大约保存 4 KB。

数据保存在服务器端会占用服务器的内存空间,如果存储信息过多、用户量过大,会严重影响服务器的性能。

想了解更多,欢迎关注我的微信公众号:Renda_Zhang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559706.shtml

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

相关文章

摸底谷歌Gemini:CMU全面测评,Gemini Pro不敌GPT 3.5 Turbo

谷歌的 Gemini 到底几斤几两?和 OpenAI 的 GPT 模型相比表现如何?CMU 这篇论文测明白了。 前段时间,谷歌发布了对标 OpenAI GPT 模型的竞品 ——Gemini。这个大模型共有三个版本 ——Ultra(能力最强)、Pro 和 Nano。研…

ddns 被解析为127.0.0.1_我为北京冬奥加油,2020.2.1-2.10冬奥知识分享

2020.02.01中国冬梦,世界飞跃,我是果雪儿小小志愿者仇懿琛,我为北京冬奥加油,今天冬奥知识分享——冬奥会历史上那些非凡而又卓越的运动员(十一)明星运动员:米特迈尔第十二届冬季奥运会时间:1976.02.04-02.…

乱码 转ios_王者荣耀:转区数量提升25倍,教你解决检测异常,IOS也有艾琳了

王者峡谷近期最火的一个功能便是转区服务开放限量测试,由于申请的人数非常多,官方决定从今日起将测试资格由最初的2000个提升至每日开放50000个,同时由每日二次开放调整为每日一次,虽说测试资格数量提升了25倍,但依旧有…

冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱

前言原本一直在用罗技的G700s,但是鉴于众所周知的“电老虎”原因,再加上重量的问题,一直想换一个鼠标试试,虽然不太玩游戏,但是平时使用也喜欢高DPI的设置、另外还稍许有点汗手的问题,所以对鼠标长时间时候…

vue内检测是否有swiper_vue.js怎么用swiper

vue.js中使用swiper的方法:首先下载【swiper.js】;然后在【main.js】中全局引入【swiper.js】;最后在模板中配置相关内容即可。【相关文章推荐:vue.js】vue.js中使用swiper的方法:1、下载swiper.jsnpm install vue-awe…

从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库

下面我们就来说说如何从 SQLite 迁移到 MySQL 。准备首先你要已经安装好 MySQL 数据库。如果你用的是 Ubuntu 系统,请参考这篇文章。其他系统请参考各自对应的文档。导出当前数据点击蓝色的 EXPORT 按钮将当前数据库中的所有数据导出并下载到本地,默认文…

易语言mysql验证_易语言MySql注册登录

用到的主要易语言命令:连接MySql (, , , , )执行SQL语句 (, )取记录集 ()读字段值 (, , )释放记录集 ()断开MySql ()命令介绍:①、连接MySql (, , , , ):顾名思义,这条命令是用来连接你的MySql数据库的,返回一个MySql句…

java 如何跟多个字符串比较_Stack Overflow上370万浏览量的一个问题:如何比较Java的字符串...

在逛 Stack Overflow 的时候,发现了一些访问量像喜马拉雅山一样高的问题,比如说这个:如何比较 Java 的字符串?访问量足足有 370万,这不得了啊!说明有很多很多的程序员被这个问题困扰过。截止到目前为止&…

mysql+distinct+max_MySQL中distinct与group by之间的性能进行比较

最近在网上看到了一些测试,感觉不是很准确,今天亲自测试了一番。得出了结论,测试过程在个人计算机上,可能不够全面,仅供参考。测试过程:准备一张测试表CREATE TABLE test_test (id int(11) NOT NULL auto_i…

java生成大素数_用BigInteger实现大素数生成算法

一.通过素数的基本性质根据素数的性质(除了1和此整数(n)自身外,无法被其他自然数整除的数):即从2到n/2的数都不能整除n。1 public static booleanisPrime(BigInteger num)2 {3 BigInteger two BigInteger.valueOf(2);4 for(BigInteger i tw…

JAVA shell export_Java 远程调用Shell

Java 远程调用Shell上一篇 /下一篇 2014-01-21 13:29:22/ 个人分类:JavaRemote Shell Scripts need to export the ENV variable again.public class JavaRemoteRunShell {private Connection conn;private String ipAddr;private String charset Charset.default…

JAVA不同类型数组重载_JAVA补课-DAY1:方法重载和数组

IDEA简单方法使用快捷键CtrlAltL&#xff0c;IDEA代码格式化Ctrl/单行注释&#xff0c;重复按取消CtrlShift/多行注释&#xff0c;重复可取消5.fori<>for (int i 0; i < 5; i)本日重点方法重载(overload)/*方法重载(Overload)&#xff0c;多个方法名称相同&#xff0…

华为s2600t java_华为S2600T存储+华为RH2288H V3服务器

面对复杂多变的国际形势和国内艰巨繁重的改革发展稳定任务&#xff0c;维持稳定就显得格外重要。平安城市视频监控建设项目为了保证城市交通和城市治安的安全&#xff0c;需要对人员集中的重要场所和道路上监控进行建设和改造。视频监控记录的数据必须具有很高的安全性&#xf…

华为java8_Java8 Stream

简单认识Java streamJava8出了一个stream流式编程&#xff0c;在开发中或多或少用到接触过。怎么说呢&#xff01;举个例子把&#xff0c;一起我们在遍历一个集合的时候&#xff0c;我们是从外部去遍历的&#xff0c;然后才能拿到结果&#xff0c;这样来效率就会变得相对低一点…

ascii码扩展 php,php与ascii码

首先 简单说一下历史&#xff0c;ascii码最开始是美国人搞出来的&#xff0c;用来干什么呢&#xff1f;我们知道&#xff0c;计算机只知道0和1&#xff0c;如果我们要计算机识别除了01之外的字符&#xff0c;例如 a&#xff0c;我们要先告诉计算机‘1100001’就是a。跟摩斯密码…

php手机电子相册,免费电子相册制作软件 手机电子相册制作软件

照片配上音乐加上炫酷的过渡效果点缀图片和文字说明&#xff0c;轻松制作成各种视频格式的电子相册。不需要专业的视频制作知识&#xff0c;点几下鼠标就可以把上百张数码照片制作成电子相册。视频相册可以在电脑上用播放器收看或者在高清电视上播放。也可以刻录成DVD、VCD光盘…

php+spl+栈,PHP SPL标准库之数据结构栈(SplStack)介绍

栈(Stack)是一种特殊的线性表&#xff0c;因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈)SplStack就是继承双链表(SplDoublyLinkedList)实现栈。类摘要如下&#xff1a;简单使用如下&#xff1a;//把栈想象成一个颠倒的数组$stack new SplStack();/*** 可见栈和双…

深度理解java jvm,深度理解JVM

深入理解java虚拟机要讲的内容了解历史垃圾回收机制性能监控工具性能调优案例实战认识类的文件结构类加载机制字节码执行引擎虚拟机编译及运行时优化Java线程高级1. 环境搭建安装jdk2. 内存溢出场景模拟public class Test01 {public static void main(String[] args) {//测试内…

otb100matlab,ECO for tracking 在 OTB100 基准测试和 VOT2016 数据集中的实验结果

目前本文所涉内容均未使用图形处理器。运行在有图形处理器环境下的实验将在稍后补充&#xff0c;敬请关注。需要准备的文章和工具有&#xff1a;一、集成 OTB1001.1 下载基准测试在该目录中可以看到&#xff1a;trackers 目录中已经包含了若干跟踪算法。而我们要做的就是把 ECO…

如何设置oracle_home变量,oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量?

oracle-如何在Ubuntu 9.x上正确设置ORACLE_HOME变量&#xff1f;我遇到了与此处列出的问题相同的问题&#xff1a;尽管我没有丢失密码&#xff0c;但如何恢复或更改Oracle sysdba密码&#xff0c;我最初在configure脚本中输入了两次&#xff0c;然后登录(localhost&#xff1a;…