会话技术

来源:互联网 发布:新浪网络猫耳宝贝 编辑:程序博客网 时间:2024/06/01 22:19

一、会话技术:

1.隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。
2.URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。 见http://blog.csdn.net/xh16319/article/details/8464055
3.Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值。 见:http://blog.csdn.net/xh16319/article/details/8464319
4.Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话

 

二、什么是会话?

         用户开一个浏览器访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,这整个过程我们称作一次会话。

 

         比如打电话,只要电话没挂,不管和多少人说话,时间有多长,都只算一个电话。

 

三、会话过程中要解决的一些问题?

         每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,服务器要想办法为每个用户保存这些数据。

 

例如:多个用户点击超链接通过servlet各自购买了一个商品,服务器应该想办法把每个用户的商品保存在各自的地方,以便于这些用户点击结账servlet时,结账sevlet可以得到用户各自购买的商品为用户结账。

         为什么能区分不同的用户呢?

 

 

四、这些数据保存在request行不行?

         不行,request只能保存一次请求的数据。点一次超链接就是一个request,不可能保存下来的。

        

五、为什么需要cookie技术(会话技术)?

         1. 如何保存用户上次登陆时间?

 

//先获取cookie

//假设我们保存上次登录时间的cookie"lastTime""2011-11-11"

//这里我们需要考虑一个情况:用户第一次登录

Cookie []cookies=request.getCookies();

boolean b=false;//假设没有lasttime cookie

if(cookies!=null){

for(Cookie cookie:cookies){

//取出名

       String name=cookie.getName();

       if("lasttime".equals(name)){

           //显示

           out.println("您上次登录时间是"+cookie.getValue());

           //更新时间

           //把当前日期保存cookie

SimpleDateFormat simpleDateFormat =

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       String nowTime = simpleDateFormat.format(new java.util.Date());

           Cookie mycookie=new Cookie("lasttime",nowTime);

           mycookie.setMaxAge(7*3600*24);

           response.addCookie(mycookie);

       }

    }

    }

    if(!b){

       out.println("您是第一次登录");

       //并把第一次的当前日期保存在cookie

       SimpleDateFormat simpleDateFormat =

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       String nowTime = simpleDateFormat.format(new java.util.Date());

           Cookie cookie=new Cookie("lasttime",nowTime);

           cookie.setMaxAge(7*3600*24);

           response.addCookie(cookie);

       }

      

2. 购物网站显示曾经浏览过的商品?

用之前的技术,可以把相关信息存在数据库,然后在页面显示时根据对应用户信息从数据库提取 。但是,有时候我们发现没登陆时也能看到浏览历史。这种情况下,用数据库技术是没法实现的。

3. 如何把登录的用户名和密码保存到自己电脑,下次登录不需要重新输入?

 

解决的根本是cookie技术

 

Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

创建cookie是在服务器,保存cookie是在浏览器。

 

部分代码:

//创建cookie

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

       //设置cookie的生命周期

       cookie.setMaxAge(3600);

       //cookie信息回写给浏览器

       response.addCookie(cookie);

 

       //读取所有cookie信息,再选中你的cookie信息

        Cookie cookies[] = request.getCookies();

 

Cookie小结

   1. cookie是在服务器端创建

    2. cookie是保存在浏览器端

    3. cookie的生命周期可以通过cookie.setMaxAge(2000);

       如果不设置,则该cookie的生命周期当浏览器关闭时,就消亡

    4. cookie可以被多个浏览器共享

    5. 可以把cookie想成一张表

如果cookie重名会有什么问题?

    如果重名会替换之前存在的cookie

    6. 一个web应用可以保存多个cookie

    7. cookie存放的时候是以明文方式存放,因此安全性较低,我们可以通过加密后保存。

    àmd5算法:以后我们的密码都要使用加密存放,在验证密码的时候,对用户输入密码,进行md5加密,然后到数据库去验证

 

 

实际应用:

    1. 保存用户登录信息。打开登陆界面时自动填写用户名或密码。

    2. 显示用户上次浏览过的商品,最近浏览的在最上面。

 

Cookie的细节讨论:

    1.一个Cookie只能保存字符串信息

    2.一个WEB应用可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个WEB应用提供的Cookie

    3.cookie默认生命周期是会话级别(即存储在浏览器的内存中),用户推出浏览器之后即被删除。也可以自己设置。Cookie不提供明确的修改和删除操作,但可以通过其他方式实现。新建一个同名的cookie就可以实现修改,因为同名会覆盖之前的。通过兴建一个同名的cookie并将maxAge设置为0,并回写到response覆盖原来的Cookie,就实现修改。

    4.注意,删除cookie时,path必须一致,否则不会删除。(一般不考虑)

5.cookie存放中文怎么处理?

存放:

String val=java.net.URLEncode.encode(“顺平”,utf-8);

取出:

String val=java.net.URLDecode.decode(cookie.getValue,utf-8);

 

 

特别声明:

如果该web应用只有一个cookie,则删除该cookie后,在浏览器的临时文件夹下没有该cookie文件,如果该web应用有多个cookie,则删除一个cookie后,文件还在,只是该cookie没有了。

    setMaxAge(负数)相当于该cookie生命周期是会话级别。

 

 

 

Session技术

 

一些问题:

1. 例如淘宝网,张三和李四他们购买的商品不一样,他们的购物车中显示的商品也不一样,这是怎恶魔实现的?

2. 不同的用户登录网站后,不管该用户浏览该网站的哪个页面,都可显示登录人的名字,同样可以随时去查看自己的购物车中的商品。

 

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。

    当用户打开浏览器,访问某个网站时操作session时,服务器就会在服务器的内存为该浏览器分一个session对象,该session对象被这个浏览器独占。

    这个session对象也可以看作是一个容器,session的默认存在时间是30min,也可以修改。

 

session的说明:

1. session是存放在服务器内存中

2. 一个用户浏览器,独享一个session域对象。

3.session生命周期默认30分钟。(在Tomcat的配置中可以看到为30分钟),也可以修改

 

Session可以用来做什么?

1. 网上商城的购物车

2. 保存登录用户的信息

3. 将某些数据放入session,供同一个用户在各个页面使用

4. 防止用户非法登了到某个页面

 

如何理解session

可以把session想成一个容器类似于HashMap,有两列。每一行就是session的属性。

每个属性包含两个部分,一个是该属性的名字(String),另一个是它的值(Objiec)。

 

如果同一个用户浏览器像session设置一个属性的时候,如果属性名相同会出现什么情况?

会替换。

 

Session小结:

1. session是存放在服务器内存中的

2. 生命周期  默认生命周期是30min,可以通过tomcat/conf/web.xml来修改(对所有web应用生效)

<session-config>

        <session-timeout>30</session-timeout>

    </session-config>

   在单个web项目下的web.xml中修改,只对单个web应用生效。如果冲突,以自己的web应用为准。

也可以在程序中修改。session.setMaxInactiveInterval(60);60s是指发呆时间,在这个时间内访问了,session就重新开始计时。在此时间内如果没有访问,所有session均失效。

Session生命周期是发呆时间。如果重启Tomcat或是reload web应用或是关机了,session会失效。我们也可以通过方法invalidate()可以让session瞬间失效,该方法通常用于安全退出。该方法是让session中所有属性失效。

如果希望某一个session属性失效,可以使用方法removeAttribute(String name)

Cookie的生命周期是指累计时间,不管用户是否访问过cookie.

 

3. 一个用户浏览器独享一个session域对象

4. session中可以存放多个属性

5. session可以存放对象

6. 如果session.setAttribute(“name”,val),如果名字重复,则会替换该属性

 

如何防止用户放入诶发登录到某个页面?

思路:

当用户成功登录后,可以把用户信息存放在session,然后在需要验证的页面中获取用户信息,如果为null,说明用户非法,可以让其重新登录

 

使用浏览器访问某个servlet,其他浏览器快可以渠道这个servlet存的数据吗?

不能,这样会导致混乱。

 

Session的深入理解:

服务器器是如何实现一个session为一个用户浏览器服务的?

第一次创建session会生成一个session id号,一个id号对应一个客户端浏览器。

为什么第一次访问知道去创建session?因为第一次访问servlet没有带id号,所以服务器知道去创建session的同时生成一个特定的id号,并将该id号返回给浏览器,下次访问时就不需要再创建。

 

www.sourceforge.net开源之祖

Session实际应用案例:

用户登录时验证输入验证码是否正确

为什么需要验证码?防止嗅探密码,这样会对服务器数据库造成很大压力。

运用程序从图片识别数字是很困难的一项技术。

验证码案例:

原理:使用java的绘画技术

这里最重要的就是生成验证码的servlet

 

如何使用

<img src=”/验证码url”/>实际上是向服务器的一次请求,不管是图片还是url,都是文件,有一个请求的过程。所以也可以请求servlet

 

session的销毁时间的讨论。

如何实现,关掉IE后,再开IE,上次购买的商品还在?(涉及到session的销毁时间)

    我们的session生命周期如果是30min,该session不会随浏览器关闭而自动销毁,而是到30min后,才会被服务器销毁。

只有将sessioncookie结合使用才能实现


 

/session id保存在cookie中,保存id时,一定要按照规范命名

       Cookie cookie = new Cookie("JSESSIONID",session.getId());

       cookie.setMaxAge(60*30);

       response.addCookie(cookie);

 

如果阻止cookiesession也不能用,因为sessioncookie是有一定关系的。

 

如何实现,IE禁用cookie后还能用session
解决方案:URL重写

 

 

Cookiesession的区别

    1. 存在位置:

    Cookie存在客户端的临时文件夹

Session存在服务器内存中,一个session域对象为一个用户浏览器服务

2. 安全性

Cookie示意明文方式存放在客户端,安全性较弱,可以通过md5加密后再保存

Session是存放在服务器端内存中,所以安全性较好

3. 网络传输量

Cookie会传递信息给服务器

Session的属性值不会给客户端

4. 生命周期

Cookie的生命周期是累计的,从创建时就开始计时,20分钟后cookie的生命周期结束,cookiei无效

Session的生命周期是间隔的,从创建时开始计时,如20分钟,没有访问过session,那么session无效(指无法取出session属性),如果在20分钟内访问过session,那么它的生命周期重新计时

关机会造成session生命周期结束,但对cookie没有任何影响

a.关闭Tomcat

b.reload web应用

c.时间到

d.invalidate也会让session失效(主要用于网站安全退出)

 

使用原则:

因为session会占用服务器内存,因此不要向session中存放过多过大的对象,这样会影响性能。

 

5. 访问范围

Session为一个用户浏览器独享

Cookie为多个用户浏览器共享

0 0
原创粉丝点击