JavaWeb-会话

会话跟踪

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值