JavaWeb快速入门-Cookie与Session

上一篇: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)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb是一种用Java语言来开发动态网页的技术栈。它包括了Servlet和JSP两个主要的技术组件。JavaWeb的开发速度很快,功能也很强大,并且具有跨平台的特点。 JavaWeb可以用来开发静态网页和动态网页。静态网页是指提供给所有人看的数据始终不会发生变化,而动态网页是指提供给所有人看的数据会随着时间和地点的不同而发生变化。大部分网站都属于动态网页。在Java中,动态网页开发的技术统称为JavaWebJavaWeb采用B/S架构,即浏览器服务器之间的交互。相比之下,C/S架构是客户端和服务器之间的交互。JavaWeb被广泛使用,因为它可以处理高并发、高性能和高可用性的问题,并且语法类似于ASP。 如果你想快速入门JavaWeb,你可以首先学习Servlet和JSP的基本语法和用法。Servlet是JavaWeb中的核心组件,用于处理请求和响应。JSP则是一种在HTML中嵌入Java代码的技术,可以方便地生成动态内容。你可以通过学习这两个组件的基础知识,了解JavaWeb的基本工作原理和开发流程。然后,你可以进一步学习JavaWeb框架,如Spring MVC和Struts,以提高开发效率和代码质量。还可以学习数据库连接和操作、前端技术等相关知识,以完善你的JavaWeb开发技能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JavaWeb入门](https://blog.csdn.net/Massimo__JAVA/article/details/124496596)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙源lll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值