Java Web之五 会话Cookie Session
来源:互联网 发布:数据挖掘 前景 编辑:程序博客网 时间:2024/04/24 13:12
1.浏览器开始访问网站到访问网站结束期间产生的多次请求响应组合在一起叫做一次会话
会话的过程中会产生会话相关的数据,我们需要将这些数据保存起来。
Cookie:客户端技术
Session:服务器端技术
用来通知浏览器在访问服务器中的哪个路径及其子路径时带着当前cookie信息过来
如果不明确设置,则默认的路径是发送Cookie的Servlet所在的路径
http://localhost/Day05/servlet/...
setDomain与getDomain方法
3.Session
Session 是一个域
作用范围:当前会话范围
生命周期:
当服务器被非正常关闭时,随着虚拟机的死亡而死亡.
4.cookie是客户端技术
5.ServeltContext 、reqeust、session域的比较
会话的过程中会产生会话相关的数据,我们需要将这些数据保存起来。
Cookie:客户端技术
Session:服务器端技术
2.Cookie
Cookie是基于set-Cookie响应头和Cookie请求头工作的,服务器可以发送set-Cookie请求头命令浏览器保存一个cookie信息,浏览器会在访问服务器时以Cookie请求头的方式带回之前保存的信息
response身上具有addCookie的方法,可以将创建出来的组织成响应消息中的set-cookie头,通知浏览器保存该cookie
request身上具有getCookies方法,可以获取浏览器带过来的所有Cookie
request.getCookies();
response.addCookie(Cookie c);
new Cookie(String name,String value)//Cookie在构造的时候就需要设定好cookie的名字和值
getName();
getValue();
setValue();
setMaxAge与getMaxAge方法
setPath与getPath方法如果不设置cookie的MaxAge(或将其值设置为负值),则默认情况下浏览器会将cookie保存在浏览器的内存中,会随着浏览器关闭而消失。如果设置为一个正值,则代表该Cookie要保存的以秒为单位的时间值,如此,该cookie将会被浏览器保存到硬盘中去。如果将MaxAge设置为0,则是通知浏览器去删除该Cookie。
想要命令浏览器删除一个Cookie,发送一个同名同path的cookie,maxage设置为0,浏览器以名字+path识别cookie,发现同名同path,cookie覆盖后立即超时被删除,从而就删除了cookie
用来通知浏览器在访问服务器中的哪个路径及其子路径时带着当前cookie信息过来
如果不明确设置,则默认的路径是发送Cookie的Servlet所在的路径
http://localhost/Day05/servlet/...
setDomain与getDomain方法
用来通知浏览器在访问哪个域名的时候带着当前的cookie信息.但是要注意,现代的浏览器一旦发现cookie设置过domain信息则会拒绝接受这个Cookie.我们平常不要设置这个方法
注:浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie[] cs = request.getCookies();Cookie cTime = null;if(cs!=null){for(Cookie c :cs){if("laseTime".equals(c.getName())){cTime = c;break;}}}if(cTime == null){response.getWriter().write("您是第一次访问本网站!");}else{Long lastTime = Long.parseLong(cTime.getValue());response.getWriter().write("您上次访问时间是:"+new Date(lastTime).toLocaleString());}Date date = new Date();cTime = new Cookie("lastTime",date.getTime()+"");cTime.setMaxAge(3600*24*30);cTime.setPath(request.getContextPath());
3.Session
Session 是一个域
作用范围:当前会话范围
生命周期:
当程序第一次调用到request.getSession()方法时说明客户端明确的需要用到session此时创建出对应客户端的Session对象.
当session超过30分钟(这个时间是可以在web.xml文件中进行修改的)没有人使用则认为session超时销毁这个session.程序中明确的调用session.invalidate()方法可以立即杀死session.
当服务器被非正常关闭时,随着虚拟机的死亡而死亡.
如果服务器是正常关闭,还未超时的session会被以文件的形式保存在服务器的work目录下,这个过程叫做session的钝化.下次再正常启动服务器时,钝化着的session会被恢复到内存中,这个过程叫做session的活化.作用:在会话范围内共享数据
session 的原理:
request.getSession()方法会检查请求中有没有JSESSIONID cookie,如果有拿出他的值找到对应的session为他服务.如果没有则检查请求的URL后有没有以参数的形式带着JSESSIONID过来,如果有则找到对应的Session为浏览器服务器如果还找不到则认为这个浏览器没有对应的Session,创建一个Session然后再在响应中添加JSESSIONID cookie,值就是这个Session 的id
默认情况下,JSESSIONID 的path为当前web应用的名称,并且没有设置过MaxAge,是一个会话级别的cookie.
这意味着一旦关闭浏览器再新开浏览器时,由于JSESSIONID丢失,会找不到之前的Session。
我们可以手动的发送JSESSIONID cookie,名字和path设置的和自动发送时一样,但是设置一下MaxAge,使浏览器除了在内存中保存JSESSIONID信息以外还在临时文件夹中以文件的形式保存,这样即使重开浏览器仍然可以使用之前的session
response.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");String produce = (String)request.getParameter("prod");HttpSession session = request.getSession();session.setAttribute("produce", produce);//防止浏览器关闭时jsessionid丢失,设置MaxAge,以文件形式保存Cookie jc = new Cookie("JSESSIONID", session.getId());jc.setPath(request.getContextPath());jc.setMaxAge(1800);response.addCookie(jc);
URL重写:
如果浏览器禁用了Cookie,浏览器就没有办法JSESSIONID cookie,这样就用不了Session了.我们可以使用URL重写的机制,在所有的超链接后都以参数的形式拼接JSESSIONID信息,从而在点击超链接时可以使用URL参数的方式待会JSESSIONID,从而使用Session将URL进行重写拼接上JSESSIONID的过程就叫做URL重写
request.getSession() --在URL重写之前一定要先创建出Session,才有Session id,才能进行重写response.encodeURL()--- 一般的地址都用这个方法重写response.encodeRedirectURL() --- 如果地址是用来进行重定向的则使用这个方法url重写的方法一旦发现浏览器带回了任意cookie信息,则认为客户端没有禁用cookie,就不会再进行重写操作<%
request.getSession();String url1 = request.getContextPath()+"/servlet/BuyServlet?prod=电视机";url1 = response.encodeURL(url1);String url2 = request.getContextPath()+"/servlet/BuyServlet?prod=冰箱";url2 = response.encodeURL(url2);String url3 = request.getContextPath()+"/servlet/PayServlet";url3 = response.encodeURL(url3);
%>
4.cookie是客户端技术
数据保存在客户端,这个信息可以保存很长时间session是服务器端技术
数据随时有可能被清空,所以cookie保存的数据是不太靠谱的
数据被保存在了客户端,随时有可能被人看走,如果将一些敏感信息比如用户名密码等信息存在cookie中,可能有安全问题
数据保存在服务区端,相对来说比较稳定和安全
占用服务器内存,所以一般存活的时间不会太长,超过超时时间就会被销毁.我们要根据服务器的压力和session 的使用情况合理设置session的超时时间,既能保证session的存活时间够用,同时不用的session可以及时销毁减少对服务器内存的占用.
5.ServeltContext 、reqeust、session域的比较
servletContext 的作用域是整个web应用,随着服务器启动而创建,如果应用被移除出主机或服务器关闭则销毁。
request 的作用域是整个请求链,每一次请求都会创建一个request,当请求结束时request销毁。
session 的作用于是整个会话,第一次调用reqeust.getSession时创建,当一段时间没有使用或服务器关闭或调用session.invalidate方法时销毁
什么时候用ServeltContext什么时候用reqeust什么时候用session?
如果一个数据只是用来显示的话就用request域
如果一个数据除了用来显示以外我一会还要用,这时候用session
如果一个数据除了用来显示以外还要给别人用,这时候用ServletContext域
0 0
- Java Web之五 会话Cookie Session
- java web之会话技术cookie+session
- java web笔记之会话跟踪cookie&session
- java HttpServlet 之 会话Cookie和Session
- Java Web 之 Cookie session
- Web开发之会话管理技术(Cookie、Session)
- Java Web会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- Java Web(三) 会话机制,Cookie和Session详解
- 会话之Session与Cookie
- java--会话管理(Cookie Session)
- WEB中的会话技术:Cookie及Session
- Web会话技术Cookie和Session
- 用PowerBuilder制作指示灯
- win7中Java之jdk环境变量配置详细步骤
- 拼接sql语句中单引号和双引号的问题
- 判断去电或来电已经接通
- 深入浅出Docker(一):Docker核心技术预览
- Java Web之五 会话Cookie Session
- 浅析PowerBuilder下动态SQL语句
- 给Jquery easyui 的datagrid 每行增加操作链接
- Android 卡片效果(仿苏宁"易付宝钱包"首页)
- iOS开发--UITableView全面解析
- Objective-C Runtime
- Activiti 5.16 流程图高亮追踪 中文乱码问题解决方法
- Java线程池的详细介绍
- jquery的each()详细介绍