5 Session(从Servlet学到JSP)

0 Session解决的问题:

重定向的时候,第二次链接发送的是新的请求。

解决不同请求的数据共享。但前提是同一个用户。

解决的问题:

用户的活动发生在多个请求和响应之中,作为web服务器来说,必须能够采用一种机制来唯一地标识一个用户,同时记录该影虎的状态。

为了实现上述需求,需要以下两种机制:

  • 会话:服务器应当能够标识出来单个用户的一系列请求,并把这些请求组成一个单独的工作会话。通过把待定请求和一个特定的工作会话相联系。
  • 状态:服务器应当能够记住前面请求的信息,以及对前一请求作出的处理信息。也就是说,服务器应当处于给每个会话联系状态。

1 什么是Session?

​ Session是服务器端存储技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的Session对象,由于Session为用户浏览器独享,所以用户在访问服务器的Web资源时,可以把各自的数据放在各自的Session中,当用户再去访问服务器中的其它Web资源时,其它Web资源再从用户各自的Session中取出数据为用户服务。

​ 在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(Session对象),注意:一个浏览器独占一个Session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

session对象代表依次用户会话。依次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开位置,这个过程就是一次会话。

  • 当浏览器第一次访问服务器时,服务器会创建session对象(该对象有一个唯一的id,一般称之为Session ID),接下来服务器会将sessionId以cookie的方式发送给浏览器
  • 当浏览器再次访问服务器时,会将sessionId发送过来,服务器就可以依据sessionId找到对应的sessinon对象。

session通常用于跟踪用户的会话信息,如判断用户是否登录系统,或者在购物车应用中,用于跟踪用户购买的商品等。

Servlet规范中描述了三种机制用户会话跟踪:

  • SSL安装套接字层会话
  • Cookies
  • URL重写
SSL

SSL(Secure Socket Layer安装套接字层)会话是一种运行在TCP/IP之上和像HTTP这种应用层协议之下的加密技术。SSL是HTTPS协议中使用的加密技术。

Cookies

在Cookies中以键值对的方式记录会话跟踪的内容,服务器利用响应报头Set-Cookie来发送Cookie信息。在RFC 2109中定义的Set-Cookie响应报头的格式为:

Set-Cookie: NAME=VALUE; Comment=value; Domain=value; Max-Age=value; Path=value; Secure; Version=1*DIGIT

NAME是Cookie的名字,VALUE是它的值。这组值必须首先出现,此后的属性键值对可以以任何顺序出现。
**在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID**

Commment是可选的

Domain:指定Cookie在哪一个域中有效,所指定的域必须以点.开始。可选。

Max-Age:定义Cookie的生存时间,秒为单位,如果超过了这个时间,客户端应该丢弃这个Cookie,如果指定的秒数为0,表示这个Cookie应该立即被丢失。可选

Path:指定这个Cookie在哪一个URL子集下有效。可选

Secure:没有值,指示浏览器使用安全的方式与服务器交互。可选

Version:表示Cookie依照的状态管理规范的版本,十进制整数。对于RFC 2109,Version应该为1。必需

在Servlet规范中,用于会话跟踪的Cookie的名字必须是JSESSIONID

Set-Cookie: uid=zhangsan; Domain=/sunxin.org; Max-Age=3600; Path=/bbs; Secure; Version=1*DIGIT

上面设置的Cookie,在下次浏览器访问该地址时,同时也会发送下面的请求报文:

Cookie:uid=zhangsan

服务器从请求报头中得到Cookie,然后通过表示取出在服务器中存储的zhangsan的状态信息,这样,通过为不同的用户发送不同的Cookie,就可以实现每个用户的会话跟踪。

URL重写

Cookies有安全问题。

URL重写就是在URL中附加表示客户的Session ID,Servlet容器解析URL,取出SessionID,根据SessionID将请求与特定的Session关联。

Session ID被编码为URL字符串中的路径参数,在Servlet规范中,这个参数的名字必须是jsessionid,下面是一个包含了编码后的路径信息的URL的例子

http://www.sunxin.org/bbs/index.jsp;jsessionid=1234?name=zhangsan&age=18

注意;和?

要跟着客户端的会话,就需要将所有发往客户端的URL进行编码,这可以通过调研HttpServletResponse接口中的encodeURL()方法和encodeRedirectURL()来实现,其中,encodeRedirectURL()方法主要在sendRedirect()方法调研之前使用,用于编码重定向的URL。

2 Session的特点

  • 存储在服务器端
  •  	服务器进行创建
    
  •  	依赖Cookie技术
    
  •  	一次会话
    
  •  	默认存储时间是30分钟
    

3 创建Session

session创建:

HttpSession session = request.getSession();//没有session则创建,有则获取已有的session
//还同时创建Cookie和响应了Cookie

HttpSession session = request.getSession(false);//不创建session
HttpSession session = request.getSession(true);//强制创建session

服务器将会判断针对当次会话是否创建了Session,实际上在创建Session的过程中即服务器为该会话生成了一个唯一的标识,我们称之为Session ID,与此同时,请求响应将返回保存了Session ID的Cookie信息。

该Cookie的名称为JSESSIONID(在PHP中则为PHPSESSID),默认当浏览器关闭时该Cookie将被销毁。

浏览器端通过获取到该Cookie信息后,用户下次再发起请求时(可以请求与上一次不同的Web资源),则将携带Cookie信息到服务器,服务器通过该Cookie就可以根据Session ID得知当前会话保存的Session。上次请求操作保存在session中的信息,在下次请求操作也同样可以读取到session中保存的信息。

自行车存车的案例

创建时机:

  • 在一次会话中,服务器首次需要针对该会话操作session时(在Java Web中即request.getSession(),在PHP中即session_start()),服务器才创建session,而不是用户首次访问服务器的某个网站后就立刻创建session的。然后把Session对象的Id返回

session什么时候被创建 http://blog.sina.com.cn/s/blog_89a6f5b001010gy9.html
session的创建和时间设置 http://blog.csdn.net/w8998036/article/details/51026966
php创建session的方法实例详解 http://www.jb51.net/article/60397.htm

4 Session传值:

HttpSession对象提供了下列方法

setAttribute(String,Object)
getAttribute(String)
getAttributeName()
removeAttribute(String)

getCreateTime()
getId()
getLastAccessedTime()上次访问时间
getMaxInactiveInterval()毫秒为单位的最大时间间隔
setMaxInactiveInterval(int)
getSession()该方法返回和此次请求相关联的Session,如果没有给客户端分配Session,则创建一个新的Session

例子:

请求1:

String name="张三";
HttpSession httpSession=req.getSession();
httpSession.setAttribute("name",name);
//这样其他请求里就可以取name了

请求2:

HttpSession httpSession=req.getSession();
httpSession.getId();
httpSession.getAttribute("name");

注意:存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效。

使用时机:一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。

总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求在处理时都能获取到同一个session对象。

5 session销毁

session失效处理:

  •  		将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致,则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
    

6 Session和Cookie的主要区别

Session基于Cookie技术,Session保存在服务器端(一般会设置有效期),SessionID保存在客户端。Session里面保存若干个"键-值"对,可以通过 void setAttribute(java.lang.String name, java.lang.Object value)来修改/添加

  • Cookie是把用户的数据写给用户的浏览器;
  • Session技术把用户的数据写到用户独占的session中(即保存在服务器端)。

## (2)如何获得session对象?
### 1)HttpSession s = request.getSession(boolean flag);

​ HttpSession是一个接口。
​ a.当flag为true时,先查看请求当中有没有sessionId,如果没有,就会
​ 创建一个session对象。如果有sessionId,就会依据sessionId去查找
​ 对应的session对象,如果找到了就返回该对象,找不到则会创建一个
​ 新的session对象。
​ b.当flag为false时,先查看请求当中有没有sessionId,如果没有,返回
​ null。如果有sessionId,就会依据sessionId去查找对应的session对象,如果找到了就返回该对象,找不到,返回null。

### 2)HttpSession s = request.getSession();

​ 等价于 request.getSession(true);

## (3)常用方法
session.setAttribute(String name,Object obj);
Object session.getAttribute(String name);
session.removeAttribute(String name);

## (4)session超时
a.什么是session超时?

​ 服务器会将空闲时间过长的session对象删除掉。
​ 注:
​ 为了节省内存空间。
​ 大部分服务器默认的超时时间长度为30分钟。

b.如何修改超时时间长度?

​ 方式一 修改web.xml

​ 30

​ 方式二 编程的方式

​ session.setMaxInactiveInterval(int seconds);
​ 设置两次请求之间最大的时间间隔

## (5)删除session

session.invalidate();  

## (6)session验证
step1. 登录成功之后,在session对象上绑订一些数据,比如

​ session.setAttribute(“user”,user);

step2.当用户访问需要保护的资源时,进行session验证,比如

​ Object obj = session.getAttribute(“user”);
​ if(obj == null){
​ //没有登录
​ response.sendRedirect(“login.jsp”);
​ }

## (7)比较session与cookie
session相对于cookie,优点:安全、可以存放大量的数据、支持更丰富的
数据类型。缺点是session会占用服务器端的内存空间,如果session对象
过多,会占用过多的内存空间。

# 练习
写一个servlet,输出用户上一次访问的时间。如果是第一次访问,输出
“你是第一次访问”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值