您的位置:首页 > 其它

Cookie,Session会话跟踪

2014-10-25 22:15 323 查看
JavaEE会话跟踪:

 JavaEE中使用的会话跟踪技术是Cookie和Session

 Cookie:在客户端记录用户的信息,Session会在服务端记录用户的信息

Cookie:

 注意Web应用程序使用HTTP协议来传输数据的,而这种协议是无状态的协议,一旦客户端与服务端交互数据完毕则会把这种连接断开,再一次的交互的时候

 需要再一次进行连接才可以

 使用Cookie则可以对会话进行跟踪

 如果服务器需要记录用户的状态,则可以使用response对象向客户端浏览器颁发一个Cookie,客户端的浏览器会把这个Cookie保存起来,当浏览器再一次去

 请求服务器的时候会把请求的网址连同Cookie交给服务器,服务器则通过Cookie来判断用户状态。服务器也是可以根据要求来对Cookie进行修改的

要查看某个网站的Cookie则可以在浏览器地址栏中输入:javascript:alert(document.cookie)

Cookie的使用需要本地浏览器的支持,如果不支持或是禁用了Cookie则Cookie功能就使用不了了。

java中把Cookie封装成了java.servlet.http.Cookie类,每一个Cookie都是这个类的对象

request.getCookie()获取客户端的所有Cookie,返回的方式是Cookie[],在JSP中Cookie是一个内置的对象

对于一个Web程序来说不同的用户进行访问提交的cookie是他自己的,A提交的是A的,B提交的是B的,而使用request.getCookies()返回的不是所有用户的Cookied而

是谁访问的则返回谁的不会冲突。各个客户之前Cookie是彼此独立的互不可见的。

Cookie的不可跨域名性:

 不同的网站应用中携带的是它自身的Cookie不会带其它应用的Cookie

 Cookie在客户端是由浏览器进行管理的,浏览器根据域名来作判断可以操作什么Cookie.比如images.google.com与wwww.google.com这两个是不同的域名

 这两者也是不可以相互操作Cookie的

Unicode编码:保存中文

中文是Unicode字符,在内存中占4个字符,英文则是ASCII字符,在内存中只占两个字符Cookie在使用Unicode字符时要对Unicode进行编码否则会出现乱码的情况

编码可以使用java.net.URLEncodeer类的encode(String str,String encoding)方法进行,解码时使用java.net,URLDecoder类的decode(String str,String encoding)

BASE64编码:

 这个编码可以对二进制数据进行编码

 tomcat7中cookie写入中文引发Control character in cookie value or attribute异常

 对于上面的这个异常问题则是对于Cookie来说如果有中文的情况要

 存的时候:

 Cookie = new Cookie("cookieName",java.net.URLEncodeer.encode(str,"utf-8"));

 取的时候

 URLDecoder.decode(cookie.getValue(),"UTF-8");

浏览器每次请求服务器都会携带Cookie,因些Cookie内容不宜过多,否则会导致响应速度过慢

Cookie属性:

Cookie除了name,value之外,Cookie还有其它的几个常用的属笥,每一个属性都带有getter,setter方法

1,String name:

 Cookie的名称,创建后则不可以更改

2,Object value:

 如果值为Unicode字符需要进行字符编码URLEncoder,二进制的数据要使用BASE64进行编码

3,int maxAge:

 这个是指Cookie的失效时间,单位秒。如果为正数则Cookie在maxAge秒后失效,如果为负数则表示为临时Cookie,关闭浏览器则失效,如果为0表示删除Cookie

 默认值是-1

4,String path:

 这个Cookie的使用路径如果设置为"/XXXWeb/"则只有ContextPath为"/XXXWeb"的程序可以访问这个Cookie,如果设置为"/"则本域下的contextPath都可以访问

 注意最后一个字符必须为"/"

5,boolean secure:

 表示这个Cookie是否仅被使用安全协议传输。安全协议有HTTPS,SSL等,在网络上传输数据时会先把数据加密默认是false

6,String domain:

 可以访问该Cookie的域名。如果设置为".google.com"则所有以"google.com"结尾的域名都可以访问

 注意第一个字符必须是"."

7,String comment:

 这个Cookie的用处说明,浏览器显示Cookie信息时候显示这个说明

8,int version:

 Cookie的版本号

Cookie 有效期管理

 Cookie 的maxAge属性决定Cookie的有效期单位是秒,在cookie当中可以通过getMaxAge()与setMaxAge()来读写这个有效期

 maxAge属性是正数的时候表示Cookie会在maxAge秒后自动的消失,浏览器会把maxAge为正数的Cookie持久化(写到相应的Cookie文件中)

 Cookie cookie = new Cookie("name","xiaoxie");

 cookie.setMaxAge(Integer.MAX_VALUE);

 response.addCookie(cookie);

 如上面的代码则会把cookie设置为永久有效

 maxAge为负数,表示Cookie只会在本浏览器窗口及本窗口打开的子窗口中有效,关闭了窗口后则会变为无效,这种Cookie称为临时Cookie,这个时候

 Cookie是保存在浏览器自己的内存中的不会把Cookie做持久化

 Cookie的默认maxAge为-1

 maxAge设置为0则表示删除Cookie

 注意在设置了maxAge为0后,后在的response.addCookie(cookie)这个语句也不可以省的

修改Cookie:

 Cookie的修改没有单独的方法,如果要修改一个Cookie则重新设置一个同名的Cookie,这时设置的则会的原来的Cookie覆盖掉,同样的如果要删除一个Cookie

 则新建一个同名的Cookie把这个cookie的maxAge设置为0则可以

Cookie的不可跨域性:

 这里的不可跨域性表示不同的网站颁发的Cookie是不会串的,这是Cookie的隐私安全机制决定的。

 对于同一个域名下的不同的二级域名下Cookie也是不可以相互访问的,如果要访问的话则要通过设置Cookie的domain参数

 注意domain参数是以"."开始的

Cookie的路径:

 domain指定了运行访问Cookie的域名,path属性则决定了允许访问Cookie的路径,如果指定某个路径下的程序才可以访问Cookie的话则可以把path设置为"/XXXX/"

 如果所有的路径都可以访问的话则可以设置为"/"

 页面只能获取到它属于的path的Cookie,比如/session/a/test.jsp访问不到/session/b/路径的Cookie

 注意:设置path则一定是要以"/"这个结尾的

Cookie的安全属性

 secure属性,设置为true时则浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie

 注意对于这个安全属性并不能对Cookie内容进行加密因而还是存在安全隐患的,如果要更安全则可以在程序中对Cookie的内容进行加密、解密

JavaSrcipt中操作Cookie

 Cookie是保存在浏览器当中的,可以使用脚本JavaScript,VBScript等操作Cookie

 <script>document.write(document.cookie);</script>

 上面的代码会在浏览器中输出本页面所有Cookie

 如果要单独的获取某一个Cookie的值只能手工去解析字符串

 在JSP当中对中文设置Cookie时要记得用encodeURI(string)

 取到值后再进行decodeURI(string)

 在使用javascript进行cookie设置的时候都进行编码

 document.cookie = encodeURI(name)+"="+encodeURI(value);

保存登录信息:

 第一种方式直接把登录名和密码保存在Cookie当中设置Cookie的有效期,下次访问的时候直接从Cookie中取得用户名密码与数据库中进行比较

 第二种与第一种类似只是在保存密码的时候加密读的时候再解密后与数据库的比较如果这种方式稍安些

 上面两种方法都要每次去查询数据库,还有一种方法把账号按一种规则进行加密连同账号一起保存在Cookie当中,下次访问则只需要判断账号

 的加密规则是否正确无需再从数据库去读取

Session机制:

 Session是一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中而Session保存在服务器上,客户端浏览器访问服务器的时候,把客户

 端的信息以某种形式记录在服务器上,当客户端浏览器再次访问时只需要从这个Session中查找客户的状态就可以了。

Session对应的类是javax.servlet.http.HttpSession类,每一个来访问者对应一个Session对象,所有的Session对象都保存在这个Session对象里,Session对

象在客户第一次请求服务器的时候创建的,Session也是一种key-value属性对

getAttribute(String key)可读取,setAttribute(String key,Object value)方法读写客户状态信息

Servlet通过request.getSession()方法获取客户的Session

HttpSession session = request.getSession();

session.setAttribute("loginTime",new Date());

out.println("登录时间是:"+(Date)session.getAttribute("loginTime"));

另外request还可以使用getSession(boolean create)来获取Session,区别在于如果客户的Session不存在request.getSession()会返回null,而如果是request.getSession(true)

则会在这种情况下会先创建一个Session再去返回这个Session

Servlet中通过request来取得HttpSession,而在JSP中则内置了session隐藏对象,在JSP当中如果<%@ page session="false"%>则在JSP中session隐藏对象不可用

Session的使用要比Cookie要简单,但是过多的Session存在服务器内存中也会对服务器造成压力

Session的生命周期:

Sesson存在服务器中,为了更高效的存储则会把Session存在内存中,每一个用户都会有一个独立的Session.这个时候如果Session过于复杂,当大量的客户访问服务器的时候会导致

内存的溢出。

Session会在用户第一次访问服务器的时候进行创建,注意只有访问JSP,Servlet等时才会创建Session,访问静态资源是不会创建Session的

使用request.getSession(true);强制产生session的

当Session生成后,只要用户继续访问服务器会更新Session最后访问时间,并维护这个Session

Session有效期:

服务器是会把长时间没有访问的Session从内存中删除的,这个时长就是Session的超时时间,如果超过这个时间则会自动失效

Session的超时时间为maxInactiveInterval属性,可以通过getMaxInactiveInterval()获得,通过setMaxInactiveInterval(long interval)修改

Session的超时时间可以在Web.xml中修改,可以通过调用Session的invalidate()来使用Session失效。

Session的常用方法:

void setAttribute(String attribute,Object value);

 设置Session属性,value参数可以为任何java object对象,通常是一个JavaBean 信息不宜过大

Object getAttribute(String attrubute)

 返回Session属性

Enumeration getAttributeNames()

 返回Session中存在的属性名

void removeAttribute(String attribute)

 移除Session

String getId()

 返回Session的ID,这个ID是由服务器创建的不会重复的

long getCreationTime()

 返回Session的创建日期返回类型是long常常被转为Date类型

 Date createTime = new Date(session.getCreationTime());

long getLastAccessTime()

 返回Session的最后活跃时间,返回类型为long

int getMaxInactiveInterval()

 返回Session的超时时间,单位是秒

boolean isNew()

 返回这个Session是否是新创建的

void invalidate()

 使这个session失效

在Tomcat中Session的默认超时时间为20分钟,通过setMaxInactiveInterval(int seconds)修改超时时间

可以修改web.xml改变Session的默认超时时间

<session-config>

 <session-timeout>60</session-timeout>

</session-config>

Session运行原理

 Session需要浏览器的支持

 Session是保存在服务器的,HTTP协议是无状态的,那么Session无法通过一个链接来判断是否为同一个用户

因而服务器会向客户端浏览器发送一个名为JESSIONID的Cookie,它的值就是这个Session的id,这个ID就是HttpSession.getId()

的返回值,这样Session是根据这个Cookie来识别是否是同一用户的

Cookie是服务器自动生成的,它的maxAge属性一般是-1,表示仅当前浏览器有效,并且各个浏览器窗口之间是不会共享的,关才了浏览

器则会失效,因而对于同一机器的不同浏览器访问服务器会生成两个不同的session,注意窗器子窗口是会继承父窗口的Session的

如果浏览器不支持Cookie或者客户端浏览器把Cookie的功能禁用掉了,这个时候要使用Session的功能则JavaWeb提供了另一种解决办法

URL地址重写。

URL地址重写原理:

 把用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id

 在JSP当中可以使用response.encodeURL方法实现URL地址重写

 这个方法会先去判断客户端是否支持Cookiev,如果是支持Cookie则会把URL按原来的方式进行输出如果不支持则会把Session的id重写到

url当中

<a href="<%=response.encodeURL("index.jsp")%>"></a>

在文件名的后面 在URL参灵敏的前面添加字符串“;jsessionid=xxxxx”,这里的纟xxxxx就是Session的id,用户单击这个链接的时候会把Session的id通过

URL提交到服务器上,服务器通过解析url地址来获得这个Session的id

如果是重定向URL地址重写可以如下:

<%

 if("administrator".equals(userName)){

  response.sendRedirect(response.encodeRedirectURL("administrator.jsp"));

  return;

 }

%>

注意:对于Tomcat来说它判断客户端浏览器是否支持Cookie是根据请求中是否含有Cookie,就算是客户端可能支持Cookie,但由于第一次访问的时候不携带任

何的Cookie,URL地址重写后的地址后面还是会带有jsessionid,第二次访问服务器的时候已经有了Cookie则不会再带有jsessionid

禁止Cookie

通过配置方式禁止Session中使用Cookie

1,针对某一个Web应用程序禁止

 在/META-INF/context.xml如果没有则新建

 <?xml version="1.0" encoding="UTF-8">

 <Context path="/XXX" cookies="false">

 </Context>

2,全局的Tomcat中conf/context.xml

<Context cookies="false">

 .....

</Context>

注意:禁止后,Session不会使用Cookie作为识别标示,这时服务器不会自动维护JSESSIONID的Cookie了,其它的Cookie还是可以正常的读写的

Cookie与Session比较

1,读取方式上比较

 Cookie只能保存ASCII字会串,如果要读取非Unicode字符或者二进制的数据utf-8,gbk或BASE64等方式进行编码,Cookie中也不能存储Java

 对象

 Session可以存储任何类型的数据,可以把Session看作是一个容器

2,安全性上比较

 Cookie存在客户端中,那么客户端的一些程序是可以进行窥探、复制、修改Cookie中的内容的,而Session存储在服务器上,对客户端来说是透明的

 不会存在敏感信息泄露的危险

 使用Cookie不要存储敏感信息,最好对数据进行加密存储,Session存放在服务器中安全性比较好

3,有效期比较

 Cookie是可以在客户端存放很久的可以通过Cookie的maxAge这个属性的设置来达到效果

 理论上Session也是可以设置有效期的它也有一个超时的时间属性maxInactiveInterval

 但是要记住Session依赖JSESSIONID的Cookie,这个Cookie的maxAge默认是-1的,只要是关闭了浏览器则Session就会失效

4,从对服务器的压力上比较

 Session存在服务器端,每个用户都会产生Session,如果并发访问的用户过多的话则会消耗更多的内存,而Cookie是保存在客户端的,不会占用服务器的资源

5,从浏览器支持上比较

 Cookie是需要客户浏览器支持的

 Session如果Cookie在浏览器进行禁用了或不支持也是可以使用的只是所有用到Sesson程序的URL都要使用response.encodeURL(url)

 可者response.encodeRedirectURL(url)进行URL地址重写

6,从跨域名上来比较

 Cookie是支持跨域名访问的 比较设置domain属性值为".xiaoxie.com",则以".xiaoxie.com"结尾的所有域名都可以访问这个Cooklie

 Session是不支持跨域名的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: