专攻知识小点——回顾JavaWeb中的servlet(三)
HttpSession基本概述
**
**
1.HttpSession:是服务器端的技术。和Cookie一样也是服务器和客户端的会话。获得该对象是通过HTTPServletRequest的方法getSession()方法。此方法还有一个重载形式的方法,里面传入的是boolean类型。当为true时,功能不变;为false时,只查询。
2.HttpSession的底层其实就是Cookie的实现方式:即根据特殊的Cookie(JSESSIONID=HttpSession对象的id,由服务器生成,唯一的)的取值,在服务器的内存中根据此id进行查找这个HttpSession对象,找到了就继续服务;没有找到就创建一个新的HttpSession对象。
3.Session的运行机制:
a)当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)
b)Servlet容器为HttpSession分配一个唯一的标志符,称为Session ID,Servlet容器把Session ID作为Cookie保存客户的浏览器中
c)每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到响应的HttpSession对象,从而获取到客户的状态信息。
4.HttpSession的常用方法:
a)public Object getAttribute(String name):返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null。
b)public void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。
c)public void removeAttribute(String name):从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作。
d)public void invalidate():使此会话无效,然后取消对任何绑定到它的对象的绑定。
5.HttpSession对象的状态及转换(序列化)
a)更改内存中HttpSession对象的超时时间,可以通过修改web应用的web.xml文件,根元素下添加:
1
b)所有的bean对象最好都要实现一个Serializable接口,这样服务器就会在禁用此web应用时,用户的数据不会丢失,进行持久化存储。
HttpSession的案例
**
**
1.案例一:完成用户的一次性登录,用随机动态验证码的来进行验证。
细节代码1:
使用HttpSession存储随机生成的验证码
request.getSession().setAttribute("code", sb.toString());
从网页上得到的随机验证码:
String code = request.getParameter("code");
使用HttpSession获得随机生成的验证码
String sessionCode = (String) request.getSession().getAttribute("code");
然后就可以判断code和sessionCode是否相等来进行响应的处理。
细节代码2:
指定秒数跳转到某个页面:response.setHeader("Refresh", "2;URL=/day08");
细节代码3:
两种销毁HttpSession的方式:
a)销毁所有的HttpSession对象:request.getSession().invalidate();
b)销毁指定的HttpSession对象:request.getSession().removeAttribute("user");
2.案例二:简单购物原理案例,可以查看购物车,添加商品进购物车。
细节代码1:
当被链接的地址想要收到上一个地址的id来进行逻辑处理,可以在链接后面加上?id=2。如:购买。
细节代码2:
搞一个购物车:先查有无购物车,没有,给你一个。有就直接用。
HttpSession session = request.getSession(); //得到cart的session值,值是List。 List<Book> cart = (List<Book>) session.getAttribute("cart"); //得到的值是空,就没有购物车 if(cart==null){//创建一个购物车 cart = new ArrayList<Book>();. session.setAttribute("cart", cart); } cart.add(book);
细节代码3:
查看购物车时,如何判断购物车是否有货。
HttpSession session = request.getSession(false); if(session==null){ out.write("对不起!您还未曾购物"); }else{ List<Book> cart = (List<Book>) session.getAttribute("cart"); if(cart==null){ out.write("对不起!您还未曾购物"); }else{ out.write("您购买的商品如下:<br/>"); for(Book b:cart){ out.write(b.getName()+"<br/>"); } } }
细节代码4:
当我们希望用户在下次打开浏览器还能查看购物车里东西,可以使用Cookie对象,存储特定的信息(HttpSession的底层原理)。
3.案例3:防止表单的重复提交。
细节代码1:
在客户端,可以使用js脚本语言让用户提交一次后,按钮变灰。
form表单的写法:
<form id='f1' action=” RegistServlet” method=’post’> <input id='bt1' type='button' value='注册' onclick='toSubmit()'/></form>
js实现提交一次后按钮变灰
<script type='text/javascript'>function toSubmit(){ document.getElementById('f1').submit();//按钮具备提交功能 document.getElementById('bt1').disabled=true;//提交一次变灰}</script>
细节代码2:
md5算法的实现
MessageDigest md = MessageDigest.getInstance("md5"); byte b[] = md.digest(message.getBytes()); BASE64Encoder base64 = new BASE64Encoder(); return base64.encode(b);//采用Base64编码转换字节序列为明文。
细节代码3:
可以在提交表单中增加一个type是hidde,来存储md5的算法后的数据,然后用session同时去存储md5的算法后的数据。数据指纹的算法好处是数据无论怎么变,长度始终一样。
<input type='hidden' name='token' value='"+token+"'/> ---------------------------------------------------------------------------------------------------------- //生成一个随机的令牌String token = ""+System.currentTimeMillis()+new Random().nextLong();//算数据指纹,用MD5算法。token = MD5Util.md5(token); //放入HttpSession中 request.getSession().setAttribute("token", token);
还有种方式是不用md5算法来生成唯一的一段序列:java.util.UUID:通用的唯一标识符
String token = UUID.randomUUID().toString();//唯一的一段序列。
细节代码4:
验证表单提交的hidde类型的令牌与服务器的令牌是否一致。
String formToken = request.getParameter("token"); String sessionToken = (String) request.getSession().getAttribute("token"); if(formToken.equals(sessionToken)){ //正常提交 System.out.println("保存了:"+name); request.getSession().removeAttribute("token"); }else{ out.write("请不要重复提交"); }
3.案例3:客户端禁用Cookie后的会话数据保存问题。禁用Cookie时,输入http://localhost还是可以保存数据的。当输入的地址非这个时,数据就无法保存。两种解决方法。
a)将URL重写:当URL重写时,既是用户访问资源时,浏览器地址栏会始终带着JSESSIONID=123。HttpServletResponse类里有一个智能方法encodeURL(String url),判断用户是否禁用了Cookie,没有禁用,则不重写;禁用了就重写。
b)在网站主页提示:为了更好访问本网站,请不要禁用您的Cookie。这种方式适用于大型网站重写URL费力的做法。
END
如果看到这里,说明你喜欢这篇文章,请 转发、点赞。同时 标星(置顶)本公众号可以第一时间接受到博文推送。
关注公众号“IT咸鱼”学习更多有关知识。
获取方法:
1、扫描下方二维码并关注:IT咸鱼
2、在IT咸鱼对话框回复关键词:"资料" 一并奉上。
3、也可直接添加小编微信:mu99908888 领取
专攻知识小点——回顾JavaWeb中的servlet(三)的更多相关文章
- 专攻知识小点——回顾JavaWeb中的servlet(二)
续前篇... ServletConfig对象 Servlet的配置对象,ServletConfig对象作用域只能在一个Servlet类中使用.每个Servlet类都维护一个ServletConfig对 ...
- 在javaweb中通过servlet类和普通类读取资源文件
javaweb有两种方式读取资源文件 在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在S ...
- 在javaweb中从servlet端向jsp端传递数据的方法
1.servlet端: request.setAttribute("student", student)://向请求域中添加名称为student,内容为student中内容的数据( ...
- $Django 路飞之显示视频,Redis存购物车数据,优惠卷生成表,优惠卷的一个领取表。(知识小回顾)
知识小回顾之json序列化问题 精髓:支持python的几种数据类型(注意不是对象,不能放对象),其次是tuple变list. ensure_ascii:默认值True,如果dict内含有non-AS ...
- html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
html/css 盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width 是"宽 ...
- 知识小罐头06(tomcat8请求源码分析 中)
更正上一篇一个小错误,Connector中首先是将socket请求过来的信息封装成一个普通的Request对象(上一篇我写成HttpRequest对象,失误失误,根本就木有HttpRequest这样的 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- javaWeb中的文件上传下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- javaWeb中,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- Linux 串口工具 lsz lrz 移植
//之前写的,刚才不小心误删了,所以重新再发出来. 1 下载源码包 首先下载最新版的lrzsz,地址:https://ohse.de/uwe/software/lrzsz.html.下面以 0.12. ...
- 【题解】Computer Network
Description 给你一棵N(N<=10000)个节点的树,求每个点到其他点的最大距离. Input 第一行一个数N.接下来若干行每行两个数k,t描述一条点k到点t的边(输入数据保证无重复 ...
- Python中matplotlib.pyplot.imshow画灰度图的多种方法
转载:https://www.jianshu.com/p/8f96318a153f matplotlib库的教程和使用方法此处就不累赘了,网上有十分多优秀的教程资源.此处直接上代码: def demo ...
- 最全153道Spring全家桶面试题,你都碰到过哪些?(含答案解析)
前言 Spring 框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶. 毋庸置疑,Spring 早已成为 Java 后端开发的行业标准,无数的公司选择 Spring 作为基础的 ...
- [学习笔记] 数位DP的dfs写法
跟着洛谷日报走,算法习题全都有! 嗯,没错,这次我也是看了洛谷日报的第84期才学会这种算法的,也感谢Mathison大佬,素不相识,却写了一长篇文章来帮助我学习这个算法. 算法思路: 感觉dfs版的数 ...
- C# excel文件导入导出
欢迎关注微信公众号 C#编程大全 这里有更多入门级实例帮你快速成长 在C#交流群里,看到很多小伙伴在excel数据导入导出到C#界面上存在疑惑,所以今天专门做了这个主题,希望大家有所收获! 环境:wi ...
- 修改LiveChart的提示显示位置
问题:修改LiveChart的提示显示位置 摘要:相信WPF开发者在用LiveCharts的时候会有遇到这个需求.就是产品要求折线图的提示要显示的正常点. 需求:如下图所示.原本显示是在下方并且没有小 ...
- Chrome浏览器调试移动端网页,测试人员也可以轻松debug
现在的产品,移动端应用占据很大市场,在测试过程中,就会测试各种各样的移动端页面.测试过程,或多或少会发现些问题,无非就是前端.后端问题.后端接口问题,可以利用工具:Fiddler或charles抓包查 ...
- 自定义 Spring Boot Starter
关于Starter Spring Boot秉承"约定大于配置"的开发方式,使得我们基于Spring Boot开发项目的效率变得十分高.相信使用过Spring Boot的小伙伴都会发 ...
- Git的介绍以及安装
Git的简单介绍 Git是一个开源的分布式版本控制系统,可以有效,高速的处理从很小到非常大的项目管理,GIT是为了帮助linux内核开发而开发的一个开放源码的版本控制软件 Git的安装 Linux平台 ...