JavaWeb-会话

news/2024/5/18 13:28:50 标签: session, cookie, JSP

会话跟踪

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

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


http://www.niftyadmin.cn/n/608763.html

相关文章

Asp.Net获取本地计算机和其他计算机的MAC值的方法

转自&#xff1a; http://www.guoblog.com/blogview.asp?logID202PublicFunctionValueSepR(ByValRawStringAsString,ByValSepCharAsString)AsString IfInStr(1,RawString,SepChar)<>0Then ValueSepRMicrosoft.VisualBasic.Right(RawString,Len(RawString)-InStr(1,RawSt…

一招搞定设计模式-单例模式

单例模式 单例模式六种常见形式 * 饿汉式&#xff1a;直接创建对象&#xff0c;不存在现场安全问题。 直接实例化饿汉式&#xff08;简洁直观&#xff09; /*** 饿汉式* 直接创建实例对象&#xff0c;不管你是否需要这个对象** &#xff08;1&#xff09;构造器私有化* &a…

《天下无贼》经典语录

王薄&#xff08;刘德华&#xff09;&#xff1a;开好车就一定是好人吗&#xff1f;贼王&#xff08;葛优&#xff09;&#xff1a;说了多少次了&#xff0c;要团结&#xff01;葛&#xff1a;这次出来&#xff0c;一是通过实战锻炼队伍&#xff0c;二是考察新人……希望你们在…

Java编码规范简版

1.Java编程命名规范 一般约定&#xff1a; 命名时应始终采用完整的英文描述符。此外&#xff0c;一般应采用小写字母&#xff0c;但类名、接口名以及任何非初始单词的第一个字母要大写。 使用可以准确说明变量/字段/类的完整的英文描述符。例如&#xff0c; firstName&#…

一招搞定设计模式-工厂模式

工厂模式 简单工厂 在 Mybatis中比如 SqlSession Factory使用的是工厂模式&#xff0c;该工厂没有那么复杂的逻辑&#xff0c;是一个简单工厂模式。 简单工厂模式&#xff08; Simple Factory Pattern&#xff09;&#xff1a;又称为静态工厂方法&#xff08; &#xff08;St…

MongoBD安装配置win10服务

在mongoDB官网上下载安装完成之后&#xff0c;配置path路径&#xff0c;新建data文件夹和logs文件夹已经logs文件夹下新建文件mongodb.log。 使用命令&#xff1a; mongod --logpath"D:\XX\logs\mongodb.log"--logappend --dbpath"D:\XX\data" 但是这样…

用.NET获取汉字的区位码(C#)

首先复习一下计算机基础知识&#xff1a;计算机中最底层的数据都是用二进制及0和1来表示的。每个0或1称作1位&#xff0c;第8位二进制数叫做1个字节&#xff0c;它可以表示ASCII码中的一个字符。中文计算机中用两个字节即16位二进制来表示一个汉字。而在Unicode编码中所有的符号…

一招搞定设计模式-构建者模式

构建者模式 Builder模式的定义是“将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。”它属于创建类模式&#xff0c;一般来说&#xff0c;如果一个对象的构建比较复杂&#xff0c;超出了构造函数所能包含的范围&#xff0c;就可以使用工…