传智播客JavaWeb day05-session、url重写
1.session是什么
1.1 session是一种会话技术 ps:还有一种是cookie
2.session的作用
2.1 服务器端会话范围内的数据共享
3.session的生命周期
3.1何时创建 request.getSession()时创建(因为session与cookie有关)
3.2 销毁(三种销毁方式)
3.2.1 默认30分钟过期
3.2.2 写一个方法销毁 invalidate()
3.2.3 服务器非正常关闭
4.session的钝化与还原
4.1 钝化
当服务器正常关闭的时候,内存中的session会保存在一个文件里面(apache服务器是在work工作目录下)
4.2 还原
当服务器正常关闭后再次启动时,服务器端未过期的session会恢复到内存中
5.session的原理(JsessionId)
当客户端与服务器进行会话时,服务器会判断request的cookies中是否包含一个JSessionId的这样一个cookie,如果没有就创建一个,有的话就用来区分用户,操作session
6.问题:服务器怎么区分当前访问是来自于哪个用户 答:就用利用从客户端传来的JesessionId
7.问题引申(思考):当客户端禁用cookie是怎么办? 答:当客户端禁用cookie后,那么服务器端的session也不能用了,因为session是基于cookie技术实现的;这样基于session的一些功能都不能用了,比如利用session功能实现的购物功能,那么我们要通过其他的方式来识别用户,这是就有url重定向。url重定向是将sessionid写在url里面作为url的参数,同样可以实现区分用户的目的
8.问题:利用session实现购物、付款功能,且当用户关闭浏览器后还能结算
8.1 知识点:session的应用;session是基于cookie实现的,而普通的cookie是会话级别的当浏览器关闭的时候cookie也就销毁了,现在需求是想当浏览器关闭后再次打开的时候还能进行结算的话,也就是关闭前和再次打开时Jsessionid值是一个,也就是说要把名字为JSessionId的cookie保存到浏览器临时文件中去
9.session举例:购物付款
补充:怎么设置session的timeout时间 java和.net 都是在web配置文件中设置
url重写
1.什么是url重写
首先获取到一个url,然后将该url重写成需要的url
2.url重写的应用场景
当浏览器端禁用cookie的时候,用来传递JSessionId
3.禁用cookie的后果
3.1 浏览器端将不接收任何的cookie
3.2 服务器端基于session工作的模块都将失效
3.2 服务器可能会爆内存。原因是基于session存取数据的模块,会因为客户端不断刷新页面,不断的向session中存取数据而导致内存爆满。
4.request.getSession()
这个函数非常的智能。首先它会去cookie中找名为JsessionId的cookie,如果没有找到然后去url中名为JsessionId的参数如果还没有找到就重新创建一个cookie
5.response.URLEncoding(url)
同样,这个函数也非常的智能。如果它发现有从浏览器端传过来任何的cookie,则不会在url上加上JsessionId的参数,否则就会加上(所有第一次访问页面时,使用了该函数url会加上JSessionId参数)
6.案例
6.1防止表单提交
防止表单提交的方案目前有这么几种,js判断、提交后禁用提交控件和session防止表单提交
6.1.1 js判断
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'formsubmit.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
var flag = true;
function canSubmit(){
if(flag){
flag = false;
return true;
}
alert("请勿重复提交!");
return false;
}
</script>
</head> <body>
<form action="${pageContext.request.contextPath}/servlet/FormSubmitServlet" method="post" onsubmit="return canSubmit()">
用户名:<input type="text" name="username"/> <br>
密  码:<input type="password" name="password"/><br>
<input type="submit" value="注册"/>
</form>
</body>
</html>
6.1.2 提交后让按钮禁用(这个简单就不贴代码了)
6.1.3 session防止表单重复提交(原理就是来一个标记,一个口令来记录表单是否已经提交,用session实现就是先生成一个标记存在session中并返回到浏览器端,第一次提交后对口令,然后去掉session中的口令,这样当第二次提交过来的表单要求对口令时session的口令为空了,所有就当做是第二次提交表单) ps:这里用了一个随机数存在session中,客户端用一个隐藏的input来保存随机数,然后随表单一起提交到服务器
JSP中:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'formsubmit.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
var flag = true;
function canSubmit(){
if(flag){
flag = false;
return true;
}
alert("请勿重复提交!");
return false;
}
</script>
</head>
<%
Random r = new Random();
int validNum = r.nextInt();
request.getSession().setAttribute("validNUm", validNum);
%>
<body>
<form action="${pageContext.request.contextPath}/servlet/FormSubmitServlet" method="post" >
用户名:<input type="text" name="username"/> <br>
密  码:<input type="password" name="password"/><br>
<input type="hidden" name="validNUm" value="<%=validNum%>" />
<input type="submit" value="注册"/>
</form>
</body>
</html>
Servlet中:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { try {
Thread.sleep(4*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("text/htm;charset=utf-8");
String validNum1 = request.getParameter("validNUm");
String validNum2 = request.getSession().getAttribute("validNUm").toString();
if(validNum2!=null &&!"".equals(validNum2)&&validNum2.equals(validNum1)){
response.getWriter().write("第一次注册");
request.getSession().removeAttribute("validNUm");
}
else{
response.getWriter().write("请勿重复提交!"+validNum1+validNum2);
}
}
传智播客JavaWeb day05-session、url重写的更多相关文章
- 传智播客JavaWeb day01 快捷键、XML
2015-01-14 一直计划着学习java,今天晚上终于下定决心看了下传智播客朴乾老师的javaweb开发视频day01之第一讲,主要内容是开发工具简单介绍.怎么创建工程.Junit的介绍,我是C# ...
- 传智播客JavaWeb听课总结
一. JavaWeb基础 第一天: 1.Eclipse详解: (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合.高的JRE版本兼容低版本的 ...
- 传智播客JavaWeb day06-jstl
一.jsp标签(sun公司提供的) 二.EL表达式 三.jstl (javaserver pages standard tag library) 1.为什么要有jstl jsp标签太弱,el表达式功能 ...
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
- 传智播客JavaWeb day02笔记
2015年1月21日 今天的主要内容:介绍了几款常用Javaweb服务器,重点介绍了tomcat以及tomcat的安装和怎么样检测安装成功 1.JavaWeb常见服务器 Tomcat(免费但是只支持部 ...
- 传智播客JavaWeb day11--事务的概念、事务的ACID、数据库锁机制、
1. 什么叫做事务? 2.默认情况下每一条sql语句都是一个事务,然后自动提交事务 ps:如果想多条语句占一个事务,则可以手动设置SetAutoCommit为false 3.关键字 start tr ...
- 传智播客JavaWeb day10-jdbc操作mysql、连接数据库六大步骤
第十天主要讲了jdbc操作mysql数据库,包括连接数据库六大步骤(注册数据库驱动.获得连接对象connetion.生成传输器stament.执行查询获得ResultSet.遍历结果集.关闭资源).介 ...
- 传智播客JavaWeb day09-mysql入门、数据库操作、数据库表操作、数据行操作
不知不觉已到了第九天了,今天主要讲了关系数据库的基本概述.安装.数据库.表和数据行的操作 1. 基本概述 1.1 数据库就是用来存储数据的.早期是存在文件里面的操作起来效率低而且不是很安全. 1.2 ...
- 传智播客JavaWeb day03
ServletContext 这堂课主要讲ServletContext这个web域(可以看得见范围的)对象,web在启动的时候会创建唯一的ServletContext域对象. 作用:1.用来web域共 ...
随机推荐
- 复旦高等代数 I(15级)思考题
1.证明: 第三类分块初等变换是若干个第三类初等变换的复合. 特别地, 第三类分块初等变换不改变行列式的值. 2.设 $n\,(n\geq 2)$ 阶方阵 $A=(a_{ij}(x))$, 其中每个元 ...
- 我的android学习经历37
android虚拟机没有键盘的问题,那是因为建立虚拟机的时候没有选择skin,重新编辑选择skin就可以了
- Linux基本操作1 - 设备操作
Linux开发的过程中,肯定会使用到很多设备,所以对设备的挂载卸载是一个很基本的操作. Linux对设备的默认定义如下: 一.Linux中的硬件设备号 设 备 设 备 号 ...
- "旋转的风车"----windows(GDI)绘图
这正是秋季将尽, 冬季未到的时节. 黄土高坡上已滚起了漫天黄沙, 而这里却是万里晴空如练! 风, 丝丝入骨! 未央柳即将枯死的枝条,仍在挣扎. 街道两旁清一色的银杏树叶, 金灿耀眼. 耀的令人感动, ...
- mysql简介
1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数 ...
- 转!!log4j基础
log4j组件介绍 Log4j主要有三个组件: Logger:负责供客户端代码调用,执行debug(Object msg).info(Object msg).warn(Object msg).erro ...
- python核心编程第六章练习6-13
6-13.字符串.string模块包含三个函数,atoi(),atol()和atof(),他们分别负责把字符串转换成整型.长整型和浮点型数字.从Python 1.5起,Python的内建函数int() ...
- jQuery轮播
一,简单实现轮播 //轮播容器 .carousel //轮播容器--可设宽度 (carousel="轮播") //轮播指标 .carousel-indicators ...
- 转linq中的Single()、First()、Take(1) LINQ 标准的查询操作符 排序 orderby、thenby、Take
Single():操作一个集合,同时强要求只有一个对象匹配,并返回这一个. First():操作一个集合,可以有多个对象匹配,但是只返回第一个. Take(1):操作一个集合,可以有对个对象匹配,单只 ...
- NET中的规范标准注释(一) -- XML注释标签讲解
一.摘要 .Net允许开发人员在源代码中插入XML注释,这在多人协作开发的时候显得特别有用. C#解析器可以把代码文件中的这些XML标记提取出来,并作进一步的处理为外部文档. 这篇文章将展示如何使用这 ...