Cookie和Session

本文深入讲解了会话技术的基本概念及其在HTTP协议中的应用,包括客户端的Cookie技术和服务器端的Session技术。探讨了如何利用这两种技术保存用户会话数据,并详细介绍了它们的工作原理、设置方法及常见问题解决方案。
会话技术
什么是会话?它可以解决什么问题?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

会话技术解决了http协议无状态。

简单说:使用会话技术,可以保存我们用户在一次会话过程中,所产生数据。

java中的会话技术分成两种:
     浏览器端会话技术:cookie
     服务器端会话技术:session.

Cookie会话技术

Cookie类
1.构造方法
new Cookie(String name,String value);
要想将cookie信息携带到浏览器端,需要使用response.addCookie(Cookie c);

2.要想在服务器端获取所有的cookie
Cookie[] cs=request.getCookies();

Cookie类中提供方法

getName(); 获取cookie名称
getValue(); 获取cookie值

示例:显示用户上一次访问时间
================================================
常用API:
new Cookie(String name,String value)

getName()获取名称
getValue(); 获取值

setMaxAge();Cookie创建时默认是会话级别,它是存储在浏览器内存中,如果关闭浏览器,这时cookie就被删除。
            使用这个方法,可以让cookie变成持久化,也就是说,可以保存在硬盘上的。 

setPath();  setPath("/");
用于设置cookie在访问什么样的资源时会携带,简单就是设置cookie的路径 。

删除cookie:
setMaxAge(0); 立即删除cookie
setMaxAge(-1);关闭浏览器后删除。

注意事项:path一定要一致.

=====================================================
示例:显示上次访问商品记录

=========================================================================
复习:
cookie是客户端的一种会话技术。
会话:打开浏览器,进行一系列操作,一至到关闭浏览器这个过程叫会话技术。

问题:关于cookie中携带中文。我们可以将中文的utf-8码存储到cookie中。
示例:记住用户名.

将汉字的码值存储到cookie中,在页面上通过javascript或通过jsp进行转码显示。

一个Cookie的大小不能超过4Kb,浏览器针对一个网站能存20个cookie,总共能存300个

--------------------------------------------------------------------------------------------
Session:
服务器端的会话技术

问题1:session怎样获取,怎样使用?

session的类型是HttpSession.
要想获取一个session可以通过 request.getSession()方法获取到.

session是一个域对象。
setAttribute()
getAttribute();
removeAttribute();

问题2:session怎样保证一个浏览器有一个专属的session.

通过将session的id值存储到cookie中,每一次请求时,都将会id 值传递到
服务器端,服务器端通过request.getSession()时会判断是否存在这样id值的
session对象,如果存在,会直接获取,如果不存在,会重新创建。

============================================================
示例:使用session实现购物车.

----------------------------------------------------------
关于禁用cookie后,session失效问题:
因为session它是使用cookie来保存jsesionid值,如果禁用了cookie,session使用不了。

解决方案:
我们人为将jsessionid的值添加到请求中。就可以。
     http://localhost:8080/day9_2/demo2;jsessionid=E4303E9F23E0EB23EEB13B318E9F1C2A
手动完成这个事不合适:可以通过url重写完成。

使用以下两个操作就可以完成url重写:
response. encodeRedirectURL(java.lang.String?url) 
用于对sendRedirect方法后的url地址进行重写。
response. encodeURL(java.lang.String?url)
用于对表单action和超链接的url地址进行重写

注意:以上操作,如果检测到浏览器禁用了cookie,会在路径上添加jsessionid值。
否则不会添加。

==================================================================
session失效问题:

1.服务器停止  session一定没了。
2.session有默认销毁时间.
tomcat服务器的conf/web.xml文件中配置了session默认销毁时间
    <session-config>
<session-timeout>30</session-timeout>
</session-config>

3.HttpSession类中提供一个方法.
invalidate()用于销毁当前的session。例如:注销操作就是使用它完成的。


4.可以通过HttpSession来设置session过期时间。
public void setMaxInactiveInterval(int interval)
可以用于设置session过期时间.参数代表秒值。

===================================================================
当我们关闭浏览器后,session就会销毁。
session的销毁与关闭浏览器无关,而关闭浏览器后,不能使用session是因为  cookie是会话级别的问题。

=======================================================
示例:一次性验证码

在ImageCodeServlet类,它就是一个验证码。图片上显示的信息都是我们人为设定的。
那么当图片产生时,我们可以将验证中的信息保存到session中。

在注册(登录窗口)操作中,向servlet提交请求时,
request.getParameter()  获取输入的验证
request.getSession().getAttribute();去获取生成的验证码。

request.getSession().removeAttribute();获取完成后,马上移除。

=====================================
关于Servlet中的三个域对象。

1.ServletContext  作用域:整个web应用
2.HttpSession     作用域:一次会话
3.HttpServletRequest 作用域:在重定向时产生的请求链中。

对于域对象常用操作
Object getAttribute(String name);
void setAttribute(String name,Object obj);
removeAttribute(String name);

这三个域对象我们怎样使用?
能用request域解决的全都用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值