JavaWeb-会话
来源:互联网 发布:淘宝怎样请人代付 编辑:程序博客网 时间:2024/05/15 11:37
会话跟踪
Cookie通过在客户端记录信息确定用户身份,Session通过在服务端记录信息确定用户身份。
Cookie
Cookie可以弥补HTTP协议无状态的不足,在Session出现之前,基本上都是用Cookie来跟踪会话。
浏览器输入javascript:document.write(document.cookie);显示本网站颁发的所有Cookie。
Cookie cookie1= new Cookie("key","value");
response.addCookie(cookie1);//新增cookie
Cookie[] cookies = request.getCookies();// 所有的 cookie
for(int i=0; cookies!=null&&i<cookies.length; i++){ Cookie cookie = cookies[i]; if("key".equals(cookie.getName())){ value = cookie.getValue();//读取cookie }
}
域名不同,cookie不能互相操作。
Cookie使用Unicode字符时,需要对Unicode字符进行编码。
// 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码.Cookie cookie = new Cookie( URLEncoder.encode("姓名", "UTF-8"), URLEncoder.encode("张三", "UTF-8"));
response.addCookie(cookie);
//输出
for(Cookie cc : request.getCookies()){ String cookieName = URLDecoder.decode(cc.getName(), "UTF-8"); String cookieValue = URLDecoder.decode(cc.getValue(), "UTF-8"); out.println(cookieName + "="); out.println(cookieValue + "; <br/>");}
Cookie使用BASE64编码
byte[] binary=new byte[(int)file.length()];
String content= BASE64Encoder.class.newInstance().encode(binary);
//从 Cookie中取二进制数据
byte[] binary= BASE64Decoder.class.newInstance().
decodeBuffer(cookie.getValue().replace("",""));
response.getOutputStream().write(binary);
Cookie属性
每个属性对应一个getter和setter方法
String name
Cookie名称,创建不可更改
Object value
该Cookie的值,必要时需要编码
int maxAge
该Cookie失效时间,单位秒。若为负数则为临时Cookie,关闭浏览器失效,如果为0表示删除该Cookie。默认为-1
boolean secure
该Cookie是否仅被使用安全协议传输,默认false
String path
该Cookie使用路径,如果为”/sessionWeb/”,则”sessionWeb”的程序可以访问该Cookie,如果设置为”/”,则本域名下contextPath都可以访问该Cookie。最后的字符必须为“/”
String domain
可以访问该Cookie的域名,如果为”.google.com”,则google.com结尾的域名都可以访问,第一个字符必须为“.”
String comment
该Cookie的用处说明
int version
该Cookie使用版本号
l 想要修改Cookie只能使用同名Cookie覆盖原来的Cookie达到修改的目的,删除只要把maxAge设为0。
l 从客户端读取Cookit时,包括maxAge在内的其他属性都是不可读的也不会提交,浏览器只会提交name和value属性,maxAge只被浏览器用来判断Cookie是否过期。
Session
l session保存在服务器上。Session为javax.servlet.http.HttpSession类实例,每个来访者对应一个session对象。
l Session也是key-value的属性对,通过getAttribute(String key)和setAttribute(String key,Object value)。
l Servlet中必须使用request来编程式获取HTTPSession对象,JSP中内置了Session对象,若声明<%@page session=”false”%>则不可用。
l 只有访问Servlet、JSP才会创建Session,只访问HTML等静态资源不会创建Session,除非request.getSession(true)强制生成Session。
l 通过getMaxInactiveInterval()和setMaxInactiveInterval()获取和设置Session有效期。web.xml中也可修改。调用Session的invalidate()使Session失效。
l Session需要使用Cookie作为识别标志,服务器向浏览器发送一个名为JSEEIONID的Cookie,它的值为Session的id。该Cookie的maxAge一般为-1。
l 浏览器不支持Cookie,则采用URL地址重写方案。原理,将Session的id信息写入URL地址
Session常用方法
1.void setAttribute(Stingname, Object value),设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。value通常为JavaBean
2.ObjectgetAttribute(String name),在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
3.Enumeration getAttributeNames(),返回Session中存在的属性名。
4.void removeAttribute(Stringname),删除指定名字的session属性,若该属性不存在,则出现异常。
5.void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。
6.String getId(),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
7.voidsetMaxInactiveInterval(int interval),设置会话的最大持续时间,单位是秒,负数表明会话永不失效。在web.xml中单位为分钟<session-timeout>
8.intgetMaxInActiveInterval(),获取会话的最大持续时间。
9.long getCreationTime()和long getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
Date creationTime = new Date(session.getCreationTime());
Date accessedTime = newDate(session.getLastAccessedTime());
HttpSession session = request.getSession();session.setAttribute("session_username", name);
String s=(String) session.getAttribute("session_username");
URL地址重写
当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。当客户端浏览器中禁止 Cookie,Servlet容器无法从客户端浏览器中取得作为Cookie的Session ID,也就无法跟踪客户状态。
本质:Java Servlet API 中提出了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,Servlet 容器可以重写客户请求的 URL,把 Session ID 添加到 URL 信息中。
HttpServletResponse 接口提供了重写 URL 的方法:publicjava.lang.String encodeURL(java.lang.String url)
该方法的实现机制为:先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
我们可以对网页中的链接稍作修改,解决以上问题:
修改前:<a href=“maillogin.jsp“>
修改后:<ahref=“<%=response.encodeURL(“maillogin.jsp“)%>“>
它可以在对方浏览起步支持cookies时实现会话跟踪。
这个技术叫URL重写。你可以在你的servlet、jsp中的forword()、sendRedirect()方法中放入经过该方法重写过的URL,以保证在用户浏览器关闭cookie时还能跟踪会话。
如果是页面重定向,URL地址重写:
response.sendRedorect(response.encodeRedirectURL(“index.jsp”));
Cookie和Session比较
Cookie只能存取ASCII字符串,其他编码需要进行编码解码。Session可以存取任何Java对象。
Session信息更安全。
Cookie实现免登陆更方便。
Cookie可以减少服务器压力。
Cookie需要浏览器支持。
Cookie支持跨域名,Session不可以。
- JavaWeb-会话
- JavaWeb-会话
- JavaWeb-会话
- JavaWeb之会话技术
- JavaWeb基础 - 会话
- JavaWeb基础 - 会话
- JavaWeb---会话管理---Cookie
- JavaWeb---会话管理---Session
- JavaWeb -- 会话, Cookie 和 Session
- javaweb会话技术深入探讨
- JavaWeb会话Session知识大纲
- JavaWeb 会话管理(cookie)
- JavaWeb项目 实现https会话
- JavaWeb开发会话与状态管理
- JavaWeb状态与会话管理Session
- JavaWeb开发会话与状态管理
- JavaWeb-10(会话技术之session&JSP)
- 深入分析JavaWeb Item10 -- Cookie会话管理
- JavaScript--《剑指offer》-题二十七
- Unity3d入门基础之UGUI-基本控件的学习-搭建界面的常规步骤
- 689. Maximum Sum of 3 Non-Overlapping Subarrays 【Hard】 动态规划
- JavaWeb之文件上传、下载
- 习题6.4作业提交
- JavaWeb-会话
- JQuery
- 数据预处理之归一化
- vim 项目管理工具(project)
- test CSDN image question
- SDUT 3344 数据结构实验之二叉树五:层序遍历
- sikuli基本函数介绍
- 视频项目笔记(5)
- UVa 12563(一种错误做法和一种正确做法)