概述
上一篇:JavaWeb学习总结09–Servlet(2)
下一篇:JavaWeb学习总结11–JSP(1)
会话技术
会话技术是在Web开发中,服务器跟踪用户信息的技术,当用户通过浏览器访问Web应用时,通服务器需要对用户的状态进行跟踪。当客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。在一个会话种可以包含多次请求和响应,在这个过程中数据可以共享。
我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在JavaWeb中,使用Session来完成会话跟踪,Session底层依赖Cookie技术。( 客户端会话技术:Cookie、服务器端会话技术:Session)
Cookie:
Cookie是一种客户端会话技术,它用于将会话过程中的数据保存到用户的浏览器中,从而使浏览器和服务器可以更好地进行数据交互。Cookie本身就是一个键值对,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,以后我们每次访问服务器时,都会在HTTP请求头中将这个Cookie回传给WEB服务器,通过这样的操作,服务器就可以对客户端进行识别了。
cookie一般用于存出少量的不太敏感的数据,主要用于在不登录的情况下,完成服务器对客户端的身份识别。
Cookie类的方法:
方法声明 | 功能描述 |
---|---|
Cookie(String name, String value) | 构造方法 |
getName() | 获取Cookie的名称 |
setValue() | 设置Cookie的值 |
getValue() | 获取Cookie的值 |
setPath() | 设置Cookie项的有效目录路径 |
getPath() | 获取Cookie的路径 |
setDomain() | 设置Cookie的有效域 |
setMaxAge() | 设置Cookie在浏览器上保持的时间,以秒为单位 |
getMaxAge() | 获取Cookie在浏览器上保持的秒数 |
setSecure() | 设置Cookie是否使用安全的协议传送 |
getSecure() | 获取Cookie是否使用安全的协议传送 |
如何使用cookie:
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个SetCookieHTTP响应报头中。
测试案例:
- 1. 创建Cookie对象,绑定数据:
new Cookie(String name, String value)
- 2. 发送Cookie对象:
response.addCookie(Cookie cookie)
- 3. 获取Cookie,拿到数据:
Cookie[] request.getCookies()
Servlet1:
response.setContentType("text/html;charset=utf-8");
Cookie cookie = new Cookie("id", "zhangsan"); //创建Cookie对象,指定名字和值
response.addCookie(cookie);
//在响应中添加Cookie对象
response.getWriter().print("发送了ID");
Servlet2:
response.setContentType("text/html;charset=utf-8");
Cookie[] cs = request.getCookies();//获取请求中的Cookie
if(cs != null) {//如果请求中存在Cookie
for(Cookie c : cs) {//遍历所有Cookie
if(c.getName().equals("id")) {//获取Cookie名字,如果Cookie名字是id
response.getWriter().print("ID:" + c.getValue());//打印Cookie值
}
}
}
Cookie相关知识
-
Cookie的规范:
一个WEB站点可以给一个WEB浏览器发送多个Cookie,WEB浏览器也可以存储多个WEB站点提供的Cookie,
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。如果我们向同时发送多个cookie,我们只需要创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。 -
Cookie在浏览器中的保存时间:
Cookie不只是有key和value,Cookie还有自己的存活时间(在客户端的有效时间),一般情况下,当我们关闭浏览器时,cookie数据就会被销毁,相对的,我们也可以通过setMaxAge(int)
来设置Cookie的存活时间。- cookie.setMaxAge(-1): cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失
- cookie.setMaxAge(60*60): 表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时
- cookie.setMaxAge(0): cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。
-
cookie中使用中文
在tomcat8之前,Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中,String name =URLEncoder.encode("姓名", "UTF-8");
。在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析。 -
path设置访问路径:
在服务器中,Cookie默认的访问路径为当前访问资源所在路径,这时会存在一些问题,这样做会不会造成cookie的浪费呢?假如我们想要在其他web项目中获取cookie数据,能不能实现呢?这时我们可以通过设置Cookie的path来进行解决。设置Cookie的路径需要使用 setPath() 方法,例如:
cookie.setPath("/cookietest/servlet");
设置详细的cookie路径,减少cookie的浪费、cookie.setPath("/");
与其他项目共享cookie。 -
domain实现二级域资源共享(不同的服务器之间共享)
如果我们希望不同服务器之间共享Cookie,我们可以使用domain方法,setDomain(String path)
,这时,如果我们设置一级域名相同,就可以实现在多个服务器之间共享数据了
案例:显示上一次访问时间:
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
//1.获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;//没有cookie为lastTime
//2.遍历cookie数组
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies) {
//3.获取cookie的名称
String name = cookie.getName();
//4.判断名称是否是:lastTime
if("lastTime".equals(name)){
//有该Cookie,不是第一次访问
flag = true;//有lastTime的cookie
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date
= new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
//响应数据
//获取Cookie的value,时间
String value = cookie.getValue();
System.out.println("解码前:"+value);
//URL解码:
value = URLDecoder.decode(value,"utf-8");
System.out.println("解码后:"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
break;
}
}
}
if(cookies == null || cookies.length == 0 || flag == false){
//没有,第一次访问
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date
= new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
Cookie cookie = new Cookie("lastTime",str_date);
//设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Session学习
Cookie技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但是,如果传递的信息比较多,使用Cookie技术显然会增大服务器端程序处理的难度。这时,可以使用Session实现,Session是一种将会话数据保存到服务器端的技术。
对象操作:
我们这里说的session其实上是一个接口(javax.servlet.http.HttpSession),我们可以把一个会话内需要共享的数据保存到HttSession对象中,然后我们只需要获取HttpSession对象即可。
获取对象:
HttpSession request.getSesssion()
:如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建Session并返回HttpSession request.getSession(boolean)
:当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在Session则返回,不存在返回null
对象的相关方法:
- 用来存储一个对象,也可以称之为存储一个域属性:
void setAttribute(String name, Object value)
- 获取session中的数据:
Object getAttribute(String name)
- 移除HttpSession中的域属性:
void removeAttribute(String name)
- 获取所有域属性的名称:
Enumeration getAttributeNames()
//在Session中存、取、删数据
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
//获取Sesseion对象
HttpSession session=request.getSession();
session.setAttribute("username", "zhangsan");//存储数据
session.getAttribute("username");//获取数据
session.removeAttribute("username");//删除数据
}
Session执行原理
-
Session底层是依赖Cookie实现的,其本身是一个服务器端对象,用于存储一次会话的多次请求的数据,当首次使用session时,服务器端要开辟一个存储数据的空间(在这个空间中可以存储任意类型,任意大小的数据),将session保存在服务器端,同时给客户端一个用cookie保存的session的id,客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
-
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),
注意:默认情况下一个浏览器独占一个session对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session的销毁
-
Session保存在服务器,而SessionId通过Cookie发送给客户端,但这个Cookie的生命不为-1,即只在浏览器内存中存在,也就是说
如果用户关闭了浏览器,那么这个Cookie就丢失
。如果用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId保存到Cookie中发送给客户端。 -
当客户端关闭后,session会被销毁,如果我们想要保存这个session对象的话,我们可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存:
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
只要浏览器容器不关闭,无论访问服务器多少次,使用的都是同一个session对象,因为我们的tomcat服务器为了去报数据不会丢失会将数据进行钝化(在服务器正常关闭之前,将session对象系列化到硬盘上)当服务器再次启动后,服务器会进行活化处理(session文件转化为内存中的session对象)。
当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,也可以在自己的web.xml中覆盖这个配置!
web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Session与Cookie的区别: Session存储数据在服务器端,没有数据大小限制,且数据相对安全,Cookie在客户端,有大小限制,相对不安全。
上一篇:JavaWeb学习总结09–Servlet(2)
下一篇:JavaWeb学习总结11–JSP(1)
最后
以上就是无辜丝袜为你收集整理的JavaWeb快速入门-Cookie与Session的全部内容,希望文章能够帮你解决JavaWeb快速入门-Cookie与Session所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复