JavaWeb开发03——会话管理

会话管理


一.会话技术概念

会话技术:浏览器开始访问网站到访问网站结束期间产生的屡次请求响应组合在一块儿叫作一次会话。会话的过程当中会产生会话相关的数据,咱们须要将这些数据保存起来。保存的技术大抵分为两种:Cookie(客户端技术)和Session(服务器端技术)。html

二.Cookie和Session概念

Cookie:Cookie是客户端技术,程序把每一个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。java

image

Session:Session是服务器端技术。利用这个技术,服务器在运行时能够为每个用户的浏览器建立一个其独享的session对象。因为session为用户浏览器独享,因此用户在访问服务器的web资源时,能够把各自的数据放在各自的session中。当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。web

image

三.Cookie(name+value)
1.获取全部的Cookie并组成组(名字+值):
request.getCookies();
2.添加Cookie(名字+值):
response.addCookie(Cookie c);
3.Cookie的构造(造的时候就须要设定好cookie的名字和值):
new  Cookie(String name,String value)
4.获取Cookie名称:
getName();
5.获取Cookie的值:
getValue();
6.设置Cookie的值:
setValue
7.设置Cookie的最大留存时间和获取Cookie的留存时间:
setMaxAge与getMaxAge
8.通知浏览器在访问服务器中的哪一个路径及其子路径时会获取当前cookie
setPath与getPath
9.通知浏览器在访问哪一个域名的时候带着当前的cookie信息(通常不使用)
setDomain与getDomain
实例:显示用户上次访问的时间
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
      
        //解决中文乱码
        response.setContentType("text/html;charset=utf-8");
        //获取全部的Cookie并组成组(名字+值)
        Cookie []  cs = request.getCookies();
        Cookie findC = null;
        if(cs!=null){
            for(Cookie c : cs){
        //获取Cookie名称
                if("lastTime".equals(c.getName())){
                    findC = c;
                } 
            }
        }
        if(findC == null){
            response.getWriter().write("您是第一次访问本网站!");
        }else{
        //获取Cookie的值
            Long lastTime = Long.parseLong(findC.getValue());
            response.getWriter().write("您上次访问时间是:"+new Date(lastTime).toLocaleString());
        }
        
        Date date = new Date();
        //构造Cookie(名字+值)
        Cookie c = new Cookie("lastTime",date.getTime()+"");
        //设置Cookie留存的最大时间
        c.setMaxAge(3600*24*30);
        //设置会设置Cookie的访问路径
        c.setPath(request.getContextPath());
        //c.setDomain(".baidu.com");
        //添加
        response.addCookie(c);
    }
Tips:

1.一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。浏览器

2.删除cookie时,path必须一致,不然不会删除(浏览器经过cookie的name+path来标识一个cookie).安全

3.若是建立了一个cookie,并将他发送到浏览器,默认状况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器以后即被删除。若但愿浏览器将该cookie存储在磁盘上,则须要使用maxAge,并给出一个以秒为单位的时间。服务器

四.Session(name+value)
1.做用范围和保留时间

做用范围:当前会话
保留时间:Session不会由于浏览器关闭而立刻销毁,会保留一段时间cookie

2.Session和Sessionid

浏览器第一次向客户端发送请求时,服务器会自动生成一个Session和sessionid,sessionid惟一标识这个sessionsession

3.Session的原理

1)request.getSession()方法会检查请求中有没有Jsession的 cookie,若是有拿出他的值找到对应的session为他服务.网站

2)若是没有则检查请求的URL后有没有以参数的形式带着Jsession过来,若是有则找到对应的Session为浏览器服务。url

3)若是还找不到则认为这个浏览器没有对应的Session,建立一个Session而后再在响应中添加JSESSIONID cookie,这个Jsessionid的值就是这个Session 的id。

4)默认状况下,Jsession 的path为当前web应用的名称,而且没有设置过MaxAge,是一个会话级别的cookie。

这意味着一旦关闭浏览器再新开浏览器时,因为Jsessionid丢失,会找不到以前的Session。

咱们能够手动的发送Jsessionid cookie,名字和path设置的和自动发送时同样,可是设置一下MaxAge,使浏览器除了在内存中保存Jsessionid信息之外还在临时文件夹中以文件的形式保存,这样即便重开浏览器仍然可使用以前的Session

image

3.建立Session的id
request.getSession()
HttpSession session = request.getSession()
4.储存Session的值
session.setAttribute("name", "zhang");
5.获取Session的值
session.getAttribute("xxx")
6.获取Session的id
session.getid
7.URL重写(浏览器禁用Cookie后的解决方法)
response. encodeRedirectURL(java.lang.String url)··· 若是有重定向,就用这个方法
response. encodeURL(java.lang.String url)
Tip:

url重写的方法一旦发现浏览器带回了任意cookie信息,则认为客户端没有禁用cookie,就不会再进行重写操做

实例1:关掉浏览器,重开,原来的Session还在

Session的id是名为Jsessionid的Cookie保存的,默认为会话级Cookie,因此咱们能够本身来创造名为Jsessionid的Cookie,而后设置Maxage来使它能够在浏览器被关掉后还能够存在,最后,关掉浏览器,而后重开,getSession方法会找到咱们设置了Maxage的Jsessionid的id,从而找到对应的Session来完成操做。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        String prod = request.getParameter("prod");
        prod = new String(prod.getBytes("iso8859-1"),"utf-8");
        
        HttpSession session = request.getSession();
        Cookie jc = new Cookie("JSESSIONID",session.getId());
        jc.setPath(request.getContextPath());
        jc.setMaxAge(1800);
        response.addCookie(jc);
        
        session.setAttribute("prod", prod);
        
    }
实例2:当Session和Cookie被禁用时如何使用Session(服务器建立了Session但浏览器中没法保存)

客户点击商品,造成的URl中带prod和Session,而后,在BuyServlet中,经过getSession方法,获取URL中的Session的id,而后将prod的值赋给Session,最后,PayServlet经过getSession方法获取URL的Session的id,取出对应Session中的prod,完成操做。

BuyServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        String prod = request.getParameter("prod");
        prod = new String(prod.getBytes("iso8859-1"),"utf-8");
        
        HttpSession session = request.getSession();
        session.setAttribute("prod", prod);
        
    }

PayServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession();
        String prod = (String) session.getAttribute("prod");
        response.getWriter().write("您购买的是"+prod+"价值99999999999元");
    }
    
JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" session="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  <%
      //URL重写
      request.getSession();
  
      String url1 = request.getContextPath()+"/servlet/BuyServlet?prod=电视机";
      url1 = response.encodeURL(url1);
      String url2 = request.getContextPath()+"/servlet/BuyServlet?prod=冰箱";
      url2 = response.encodeURL(url2);
      String url3 = request.getContextPath()+"/servlet/PayServlet";
      url3 = response.encodeURL(url3);
   %>
      <a href="<%= url1 %>">电视机</a>
      <a href="<%= url2 %>">冰箱</a>
      <a href="<%= url3 %>">结帐</a>
  </body>
</html>
五.Session和Cookie的对比

Cookie:
1)cookie是客户端技术
2)数据保存在客户端,这个信息能够保存很长时间
3)数据随时有可能被清空,因此cookie保存的数据是不太靠谱的
4)数据被保存在了客户端,随时有可能被人看走,可能有安全问题

Session:1)session是服务器端技术2)数据保存在服务区端,相对来讲比较稳定和安全3)占用服务器内存,因此通常存活的时间不会太长,超过超时时间就会被销毁.咱们要根据服务器的压力和session 的使用状况合理设置session的超时时间,既能保证session的存活时间够用,同时不用的session能够及时销毁减小对服务器内存的占用.

相关文章
相关标签/搜索