初学Servlet并了解Cookie&Session

Cookie & Session

一.Cookie

举个例子:当你打开一次浏览器,访问 jd 买了点啥东西放到购物车(注意,你的这些操作并没有登录你的jd账号!)
然后把浏览器完全关闭,再次访问jd页面,发现购物车里面的东西还在。则可以判断你前一次会话的状态信息,不可能保留在缓存,因为浏览器关闭过。想象一下,如果你用别人的电脑打开未登录的jd购物车,肯定不会有刚刚你用自己电脑放到jd购物车里的东西。所以我们判断这些状态信息保存在了你的硬盘上。这种对会话信息的保存不在服务器上,而在你的硬盘上。当然也有cookie是保存在浏览器缓存上的。

  • Cookie可以保存会话状态,但是这个会话状态会保存在客户端上(可以是浏览器缓存,也可以是硬盘),只要Cookie清楚或Cookie失效,状态就没有了。
  • 只要是Web开发,不管是不是javaweb,只要是B/S架构系统,只要基于HTTP协议,就有Cookie存在
  • Cookie这种机制是HTTP协议规定的,用来解决其无状态特性的一种方式
import javax.Servlet.ServletException;
import javax.Servlet.http.Cookie;
import javax.Servlet.http.HttpServlet;
import javax.Servlet.http.HttpServletRequest;
import javax.Servlet.http.HttpServletResponse;
public clasee 类名 extends HttpServlet{
		protected void doGet(HttpServletRequest request,HttpServletResponse,response) throws ServletException,IOException{
				//创建cookie对象  name,value
				Cookie cookie1 = new Cookie("username","zhangsan");
				Cookie cookie2 = new Cookie("password","123");
				//发送给客户端
				response.addCookie(cookie1);
				response.addCookie(cookie2);		
		}
}

默认情况,cookie被保存在缓存中,浏览器关闭就失效,cookie的保存跟路径有关,浏览器会不会发送cookie给服务器,与路径有关
假如路径是/prj-servlet-11/a 发送cookie给浏览器,则默认cookie和/prj-servlet-11/ 路径绑定
如果执行cookie.setPath(request.getContextPath()+"123");
设置cookie有效时长cookie.setMaxAge(60*60); 按秒算
值为0则直接删除,>0则保存在硬盘,默认-1

public void ReicieveCookiesServlet extends HttpServlet
{
	protected doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
	{
		cookie[] cookies =  request.getCookies();//但是这个方法可能返回null
		if(cookies != null){
			for(Cookie cookie:cookies){
				String cookieName = cookie.getName();
				String cookieValue = cookie.getValue();
				System.out.println(cookieName+"="+cookieValue);
			}
		}
	}   
}

从request对象中获取所有cookiecookie[] cookies = request.getCookies();

浏览器可以禁用cookie

二.Session

只要是Web开发,就会有session,不限于JavaWeb.
在Java中,类型为javax.servlet.http.Httpsession
Httpsession可以将会话状态保存在服务器端,保存的是当前用户的会话状态
在浏览器打开,第一次访问服务器,服务器返回创建一个HttpSession对象,并且生成对应cookie对象,此cookie 的name 是JSESSIONID,cookie的value是32位字符串
此cookie value和httpsession对象绑定到session列表中
服务器将cookie发送给浏览器客户端
客户端再次访问,首先确定cookie的name是不是JSESSIONID,然后获取cookie的value去检索session列表中对应的HttpSession对象
此cookie是保存在浏览器缓存中的,重新打开浏览器,服务器会返回一个新的sessionid给cookie保存
在这里插入图片描述
禁用cookie后,每一次的会话都是新的,需要重写URL,在本来的URL后面加 :jsessionid=32位字符串
浏览器关闭,并不会销毁原来的session对象,因为http协议是无状态的,只有请求瞬间,会连接服务器,你即使关了浏览器,服务器也不知道你关了,这样做是为了降低服务器压力
什么时候销毁session?
web服务器引用超时概念,当超时后,session销毁 默认30min
所以session存储少量的内容,一般是用户的登录成功信息

<session-config>
	<session-timeout>120</session-timeout>
</session-config>

什么是一次会话?
一般大多数,是用户在浏览器上进行一些操作,然后关闭浏览器,是一次会话。
但本质上,是直到服务器中的session对象被销毁,才算一次会话结束

public void AccessMyselfSessionServlet extends HttpServlet
{
	protected doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		String ip = request.getRemoteAddr();
		HttpSession session = request.getSession();
		System.out.println(ip+"'s session = "+session);
		}
	
}

javax.servlet.http.HttpSession接口常用方法

  • void setAttribute(String name , Object value)
  • Object getAtttibute(String name)
  • void remoteAttribute(String name)
  • void invalidate()

三个接口

  • ServletContext application : 应用范围
  • HttpSession session: 会话范围
  • HttpServletRequest request: 请求范围

Servlet接口下有HttpServlet实现了Servlet接口的所有方法

包括 public service,protected service. 二者区别是参数request和response前者是ServletRequest和ServletResponse. 后者是HttpServletRequest和HttpServletResponse
还有 doPost和doGet方法和维护Servlet生命周期的方法
我们写的Servlet一般只要继承HttpServlet,重写doPost或者doGet即可。
具体调用创建Servlet对象并且调用service方法,以调用doGet和doPost方法为终点,都由Tomcat完成,这里好像是一种设计模式,还运用了反射机制啥的,暂时还不太明白。

参考:cookie和session(https://www.cnblogs.com/l199616j/p/11195667.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值