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 setAttributeStingname, 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不可以。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办 试工两天被辞退了不发工资怎么办 员工在单位被打监控调不出来怎么办 老师罚做60张试卷家长该怎么办 孩子在幼儿园被老师打该怎么办 孩子被孩子打了老师该怎么办? 法院判决书下来后看守所不收怎么办 因病看守所不收押发院判了怎么办 现在显示还在看守所羁押需要怎么办 嫖了N多年丈夫让我怎么办 预约考试的登录密码忘了怎么办 人进了看守所信用卡没还怎么办 上海租房人放2个麻将台怎么办 南宁公租房住满5年后怎么办 合伙买房时如果出售意见不合怎么办 老旧小区改造下水一楼不同意怎么办 老旧小区下水改造没改怎么办 替公司租房子中介不退押金怎么办 想在昆山找合租房的该怎么办 链家二手房价钱买贵了怎么办 拿私人房产证抵押借钱不还怎么办 在借贷宝里借钱不还怎么办 出租屋的大门感应钥匙弄丢了怎么办 法院拍卖的房子房主不配合怎么办 租的房子如果房主卖了怎么办 房东把门锁换了里面的东西怎么办 房租没到期房东把门锁换了怎么办 租了三年店面房东违反了合同怎么办 学生登录教务系统的密码忘记怎么办 铜陵无牌助力车被交警查到怎么办 福州超标电动车被交警抓到怎么办 单位自管公租房承租人去世怎么办 取得房产证后贷款批不下来怎么办 租店面遇到难搞的房东怎么办 在拆违通知书上签字了该怎么办 单位没交公职金的退休后怎么办 公租房合同到期后没有续签怎么办 租房合同没到期不想租了怎么办 租的房子是人家公租房怎么办 五险合一软件口令忘记了怎么办