会话技术session

来源:互联网 发布:淘宝子账号如何登陆 编辑:程序博客网 时间:2024/05/22 16:46

会话概念

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

保存会话数据的两种技术

cookie机制

1.Cookie是客户端技术。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。
2.而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。
3.Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

session机制

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

session工作原理

浏览器访问web服务器,web服务器访问servlet后,当第一次访问session时,就自动创建此浏览器独享的session,此session是由key-value组成,key是String,value是object
当request访问servlet1时,建立此浏览器对应的session,并为此session分配session id,response时在cookie中回一个JSESSIONID(set-cookie中),当此浏览器再次发送http请求时,会在cookie中顺带session id,服务器根据id号寻找与之匹配的session。

创建session

//获取session 当没有就自动创建HttpSession session=request.getSession();//给该session放入属性session.setAttribute("uname", object); //取出属性String uname=(object) session.getAttribute("uname");

具体代码请参考:
Github地址:创建session
Github地址:取出session

生命周期

1.cookie的生命周期是单个设置的,为累计时间,而session得生命周期为整体设置,为发呆时间(只要访问一次就重新计时)。

HttpSession session=request.getSession();session.setMaxInactiveInterval(30)//30s

如果想要配置单个项目的发呆时间,配置如下:

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

2.当重启tomcat,reload或者关机时,session失效。可以强制让其失效,session.invalidate()一般用于安全退出,希望某个属性失效用session.removeAttribute()

案例:利用session实现验证码功能

Github地址:登陆页面
Github地址:处理页面
Github地址:创建验证码
思路:创建验证码图片,并把验证码内容存入session中,再获取用户输入的验证码,将两者进行比较,若相同验证成功,进一步去数据库验证用户名和密码等信息。

案例:session+cookie

关闭浏览器,session是不会消失的,它一直存在于服务器的内存中,只有到销毁时间过后,session才会在服务器端消失。一般情况下cookie不会保存session id的,只有我们强行把session id写在cookie中浏览器端才会保存,这样当我们利用cookie携带session id就可以访问原来已经创建好的session了。

HttpSession session=request.getSession();session.setAttribute("username", "BUPT");//把session id保存在cookie中Cookie cookie=new Cookie("JSESSIONID",session.getId());cookie.setMaxAge(3600);response.addCookie(cookie);//访问 在此访问此项目其他的servlet时,浏览器http请求中包括了cookie信息//所以自动匹配了session,直接读取session属性即可String name=(String) request.getSession().getAttribute("username");

具体代码请参考:
Github地址:cookie+session
Github地址:关浏览器再获取session

案例:当禁用cookie后,怎样使用session

由于cookie中包含session id信息,如果cookie遭到禁用的话,session也会随之无法使用,那么在用户禁用cookie后,怎么才能继续使用session呢。

利用URL重写,URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写。

String url=response.encodeURL("/myCart/BuyBookCl?id=1&name=java");
该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。
/myCart/BuyBookCl;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?id=1&name=java
具体代码请参考:
Github地址:购物车项目

0 0
原创粉丝点击