Servlet Cookie、Session

HTTP不能保持连接,可使用会话保存用户信息。

常用的会话技术有2种:Cookie、Session。

Cookie

1、原理

当用户第一次访问某个网站时,服务器设置Cookie,存储用户信息,放在响应头字段中,随HTTP响应传给浏览器,浏览器把Cookie存储到本地计算机上。

当用户再次访问该网站时,浏览器先在本地计算机上查找该网站的Cookie,如果有,放在请求头中,随HTTP请求一起发送给该网站的服务器。服务器解析Cookie,获取该用户的信息,进行相关操作。

服务器可重新设置Cookie,随HTTP响应传递给浏览器,由浏览器更新本地的cookie。

2、常用方法

  • Cookie(String name, String value)   //构造函数,name、value均为String。创建一个Cookie后,它的name不能被更改。
  • Cookie[]  cookies = request.getCookies();   //获取请求头中的所有Cookie
  • void  setValue(String value)    //Cookie的name不能被修改,所以没有setName()方法
  • void  setMaxAge(int expiry)   //设置此Cookie的有效期,从当前时间起,在浏览器上多少秒内有效。

缺省时默认只在本次会话期间有效,当我们关闭此浏览器时,会话结束,此Cookie失效,注意是关闭浏览器整个程序,不是关闭浏览器某个窗口。

为0时,浏览器会立即清除此Cookie。

为负整数时,此Cookie只在本次会话期间有效。

  • void  setPath(String url)   //设置此Cookie的作用页面。缺省时默认只对当前页面所在目录有效。

比如包servlet下有一个LoginServlet,我在LoginServlet中设置了一个Cookie,如果不给这个Cookie设置path,则默认此Cookie只在servlet包中有效(servlet包下的所有页面均可使用此Cookie)。设置为全站可用:cookie.setPath("/"),本站所有页面均可使用此Cookie。

这个不常用,因为Cookie一般都是作用于当前网站。

  • void  setDomain(String domain)   //设置此Cookie作用的网站(隶属于哪个网站),缺省时默认为当前网站。

浏览器访问一个url之前,会先根据url中的domain查找本地计算机上所有属于该domain的Cookie,把这些Cookie都加到请求头中,发送给该网站的服务器。

比如我设置一个Cookie的domain为百度: cookie.setDomain(".baidu.com"); (需要去掉www)

浏览器访问百度这个网站上的页面时,会把此Cookie添加到请求头中,随请求一同发送给百度的服务器。

  • response.addCookie(Cookie  cookie);   //把一个Cookie添加到响应头中,这样Cookie才会被传递给浏览器。
  • String  getName()
  • String  getValue()
  • String  getMaxAge()
  • String getPath()
  • String  getDomain()

3、使用示例

 1 @WebServlet("/testServlet")
 2 public class TestServlet extends HttpServlet {
 3     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4         doGet(request,response);
 5     }
 6
 7     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 8         request.setCharacterEncoding("utf-8");
 9         response.setContentType("text/html;charset=utf-8");
10         PrintWriter writer = response.getWriter();
11
12         String name=null;
13         Cookie[] cookies = request.getCookies();
14         if(cookies!=null){
15             for(int i=0;i<cookies.length;i++){
16                 if(cookies[i].getName().equals("name")){  //获取用户名
17                     name = cookies[i].getValue();
18                     writer.write(cookies[i].getValue()+",你好!");
19                 }
20             }
21         }
22         if(name==null){
23             writer.write("请先登录,3秒后将自动跳转到登录页面");
24             response.setHeader("refresh","3;url=./login.jsp");
25         }
26
27
28     }
29 }
1 String name="chy";  //注册|登录成功后,从表单获取用户信息,存储到Cookie中。这里只是模拟获取到的用户名。
2             Cookie cookie=new Cookie("name",name);
3             cookie.setMaxAge(60*60*24*365);   //一年有效
4             cookie.setPath("/");   //全站可用,本站的所有页面都可以使用此Cookie获取用户名
5             response.addCookie(cookie);  //需要添加到response中才会生效。如果要设置、更新多个Cookie,需要一个一个地添加

4、在Chrome中查看当前网站Cookie的4种方式

(1)点击地址栏中的带圈的i或者小锁

小锁表示此网站是安全的,带圈的i表示此网站是不安全的。

点击某个Cookie,再点删除,可删除该Cookie。

点击该网站的域名,再点删除,会删除该网站所有的Cookie。

点击该网站的域名,再点禁止,该网站不能在此计算机上存储Cookie(浏览器会自动删除该网站已存储的Cookie)。

(2)f12 -> Application -> Storage -> Cookies

(3)f12 -> Console -> 输入 document.cookie 可查看本网站所有的Cookie,输入 document.cookie="" 即可修改Cookie。

这种方式设置的是整个网站的Cookie,不是某个Cookie。所以一般是把document.cookie得到的值复制下来,修改里面的某些Cookie,然后以字符串的形式赋给document.cookie。

(4)设置 -> 高级 -> 隐私设置和安全性 -> 网站设置 -> Cookie -> 查看所有Cookie和网站数据

说明

  • Cookie由浏览器自己存储,各浏览器之间不共享Cookie。

比如我在Chrome中打开了某网站,该网站在Chrome中存储了Cookie,这些Cookie算是Chrome的私有数据,其它浏览器读取不到(不会共享给其它浏览器)。

  • 有时,浏览器会自动给一些网站设置一些额外的Cookie,比如_ga,_gid。

Session

1、原理

使用Cookie把会话信息保存在浏览器上,每次HTTP请求都要把Cookie添加到请求头中,服务器要从request中逐一解析Cookie,如果Cookie很多,速度会很慢。

Session是把会话信息保存在服务器上内存中,使用SessionId来唯一标识会话信息。把SessionId作为Cookie保存到浏览器上,浏览器访问页面时,会自动把该网站的SessionID这个Cookie添加到请求头中,随HTTP请求发送给服务器。服务器根据SessionId调取相应的Session,获取会话信息。

2、超时管理

当浏览器第一次访问该网站时,该网站的服务器上会创建一个Session对象来存储会话信息。

但服务器不知道浏览器会不会还会再次访问服务器,这个Session还要不要保留。如果一直保留,服务器上的Session对象会越来越多,最终耗尽服务器内存。

服务器可以设置超时时间,tomcat -> conf ->web.xml -> <session-config>:

<!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->

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

默认为30分钟。如果30分钟内,该Session没有被使用,(客户端没有再次访问),服务器会自动清除该Session,原来的会话信息丢失。

之后浏览器再次访问服务器时,request中有SessionId,但服务器上没有对应的Session对象,服务器会自动创建一个新的Session对象,把新的SessionId添加到响应头中,覆盖掉浏览器中原来的SessionId。

3、HttpSession的常用方法

  • HttpSession  request.getSession(true)    //从request中获取HttpSession对象。参数是一个boolean,表示request没有获取到HTTPSession对象怎么处理,true——自动创建并返回一个HttpSession对象,false——不自动创建,直接返回null。
  • HttpSession  request.getSession()    //从request中获取HttpSession对象,如果不存在,则自动创建并返回。一般用这个。

这2个方法的执行过程(第一个的参数为true):

从遍历request中的Cookie,找到JSESSIONID这个Cookie,获取值(SessionId),根据值获取服务器内存中相应的Session对象,并返回这个Session对象。

如果没有获取到Session对象(首次访问或Session超时已被清除),则自动创建一个新的Session对象并返回,创建新的Session对象时,会产生一个新的SessionId,服务器会自动把这个SessionId作为Cookie添加到响应头中。

  • String  session.getId()   //获取创建新Session时产生的SessionId。
  • session.setAttribute(String name, Object  value)    //往指定Session中存储数据
  • Object   session.getAttribute(String name)
  • void  session.removeAttribute(String name)
  • void  session.invalidate()   //强制使此Session对象失效,会删除此Session对象。除了等超时管理的时间到使Session失效,还可以用此方法使Session立刻失效。

4、使用示例

 HttpSession session = request.getSession();
        session.setAttribute("name","张三");

如果request中没有SessionId,或者request中有SessionId,但服务器内存中没有对应的Session(Session超时被清除),那么服务器会自动创建Session,并会自动创建 Cookie cookie=new Cookie("JSESSIONID",session.getId()) 这个Cookie,把这个cookie添加到响应头传回给浏览器,保存到客户端计算机上。

有一个问题:这个Cookie没有显式设置有效期,默认本次会话结束时Cookie失效。如果中途把浏览器关了,没到超时时间(Tomcat默认为30min),服务器上Session仍在,但保存SessionId的Cookie已经失效了,服务器从request中读取不到SessionId,也就找不到对应的Session。就是说如果中途关闭浏览器,会话信息会丢失。

解决方式:显式设置Cookie的有效期。

 HttpSession session = request.getSession();
        Cookie cookie=new Cookie("JSESSIONID",session.getId()); //name要用JSESSIONID,J表示Java
        cookie.setMaxAge(60*60*24*365);  //显式设置SessionId的有效期
        response.addCookie(cookie);  //此句代码尽量靠前(早点添加到响应消息头中)
        PrintWriter writer = response.getWriter();

这样,访客中途关掉浏览器,再次打开浏览器进行访问时,会话信息依然在。

 HttpSession session = request.getSession();
        String name =(String) session.getAttribute("name");  //返回值是Object

原文地址:https://www.cnblogs.com/chy18883701161/p/11403690.html

时间: 2024-11-10 15:51:25

Servlet Cookie、Session的相关文章

JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session

EL表达式语言 EL就是Expression Language,目的是简化JSP的语法.来看几个例子就明白了. ${test} 会翻译成<%=test%> ${test.name} 会翻译成 <%=test.getName()%> ${sessionScope.username}} 会翻译成 <%=session.getAttribute("username")%> 只有sessionScope.requestScope等才会翻译成getAttrib

cookie、Session工作原理

一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择.二.会话cookie和持久cookie的区别 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了.这种生命期为浏览

JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到 dispatcher.forward(request, response);//调

cookie、session和java过滤器

基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一定的作用.之所以把这三个放一起,是因为有很多时候都会是把他们结合在一起使用,例如有些登陆程序. cookie是浏览器的机制,session是服务器的机制,但是实际上cookie也是由服务器生成的,之后返回给浏览器的,并不是浏览器本身生成.当浏览器发送某个请求时,如果拥有有效的cookie则会把这个c

cookie、session和application都是些什么神?——图文加案例,不怕你不会,就怕你不看

cookie.session和application都是些什么神? 前言: 一直想写一篇关于cookie和session的博客,由于种种原因,一直没有整理,这不,今天还就遇到问题了,之前虽然会,但是好久没用又给忘了,结果还得查资料.是时候填坑了,闲话少说,开干. application Application用于保存所有用户的公共的数据信息,在这只是提一下,不过多解释. 下面我主要解说cookie和session,不过在解说之前有必要让大家先了解一下HTTP协议和会话跟踪 HTTP协议 协议是指

cookie、session、sessionid 与jsessionid

cookie.session.sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解. 我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案: 1. 凭借柜台职员的记忆:由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速知道顾客当前的存款以及存取的次数,每次存取的金额是多少.---- 这种方式表示协议本身支持状态. 2. 使用存折的方式:职员把每个顾客的存款/取款的信息保存在存折上,然后交给顾

cookie、session、localStorage、sessionStorage区别

cookie.session 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. cookie 1.1  Cookie机制 在程序中,会话跟踪是很重要的事情.理论上,一个用户的所有请求操作都应该属于同一个会话

Cookie、Session

Cookie.Session Cookie 保存在浏览器端. 4kb 只能保存字符串,还不能是中文. 获取:Request.getCookies(); 设置时间:setMaxAge(); 小于零是浏览器关闭就删除,等于零是替换,大于零你懂得 设置Response.addCookie(); Session 保存在服务器端. 随着浏览器关闭而消失,但是可以通过手动设置保存在cookie中,进而实现关闭浏览器后依然可以访问. 获取:getSession() getAttribute() 设置:setM

cookie、session的总结

1.状态管理(用户登录) php Asp===>cookie(客户端)本地 JSP          session(服务器) 2.setcookie("mycookie",$user,time()+1800);默认有前两个值 if($row[0]){ setcookie("mycookie",$user,time()+1800); } mycookie:设置的名字 $user:用户名 注:第一次访问不会起作用(需要再次刷新) 清除设置的cookie:setc