这里写自定义目录标题
\第5节 Session快速入门
18_会话技术_Session_原理分析
## Session:主菜
1. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2. 快速入门:
1. 获取HttpSession对象:
HttpSession session = request.getSession();
2. 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3. 原理
* Session的实现是依赖于Cookie的。
我们打开idea服务器。
在浏览器访问sessiondemo1,sessiondemo2.
在idea有获取到值Attribute
但是如果将网页关闭。
再一次访问sessiondemo2。没有获取到值,
说明session就是一次会话。
原理图
会话
会话是指一个终端用户与bai交互系统进行通讯的du过程。
比如zhi从输入账户密码进dao入操作系统到退出操作系统就是一个会话过程。会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话。
Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。
以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:(Cookie:SESSIONID=客户端第一次拿到的session ID)。这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象。
\第6节 Session细节
4. 细节:
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
* 默认情况下。不是。客户端关闭,一次会话结束。
* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
服务器都关闭了,session对象被销毁。
* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。
4. session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
20_会话技术_Session_细节2
这个视频需要重新看一遍。
有讲解一部分,路径的内容
21_会话技术_Session_细节3_session销毁
22_会话技术_Session_特点
5. session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
* session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
\第7节 Session之验证码案例
23_案例_验证码_需求&分析
24_案例_验证码_代码实现
重定向和请求转发的区别
http://blog.sina.com.cn/s/blog_8d40d34b0102uy5p.html
比喻:
请求转发:A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A。此过程A只发送了一次请求给B,A只知道把请求发给B,至于B是怎么完成的A并不关心,他只等待最终的结果。
重定向:A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成该项工作,于是A就找C帮忙,C最终完成该项工作,返回给A。
不同点:
1、浏览器地址栏显示不同(表面区别):
无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;
如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。这只是表面上看到的不同地方。
2、组件之间可否共享信息不同(本质区别)
从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;
而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。
3、实现方式不同:
3.1 请求转发的实现步骤:
1)说明将要转发的资源;
2)获取请求转发的对象;
3) 调用请求转发对象中forward()方法
Java代码
1). String forward = “/a.jsp”;
2). RequestDispatcher rd = request.getRequestDispatcher(forward);
3). rd.forward(request, reponse);
综合:request.getRequestDispatcher("/a.jsp").forward(request,response);
3.2 重定向的实现步骤:
- 说明将要重定向的资源;
- 调用response对象中sendRedirect方法
Java代码
- String resource = request.geContextPath() + “/a.jsp”;
- response.sendRedirect(resource);
综合:response.sendRediect(request.geContextPath() + “/a.jsp”);
4、知情人不同
请求转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。
而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当让WEB服务器也很明白。
相同点: 两者都可以进行多次请求的转发。
总结:什么情况下使用重定向,什么情况下请求转发,这个不是看我们的习惯,而是什么情况下必须用什么:
重定向:之前的request中存放的变量全部失效并进入一个新session的作用域;
请求转发:之前的request中存放的变量没有失效,就想把两个页面拼在一起