`

12、会话管理

 
阅读更多

一、什么是会话?

 

  • 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
  • 会话过程中要解决的一些问题?
  • ----每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
  • ----例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
  • ----保存在request或servletContext中是肯定不行的

二、保存会话数据的两种技术

 

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

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

三、API

 

  • javax.servlet.http.Cookie类用于创建一个Cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie

 

/**
 * javax.servlet.http.Cookie
 * 创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。
 * cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。 
 * 一个 cookie 拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号。
 * 一些 Web 浏览器在处理可选属性方面存在 bug,因此有节制地使用这些属性可提高 servlet 的互操作性。 
 * servlet 通过使用 HttpServletResponse#addCookie 方法将 cookie 发送到浏览器,该方法将字段添加到 HTTP 响应头,以便一次一个地将 cookie 发送到浏览器。
 * 浏览器应该支持每台 Web 服务器有 20 个 cookie,总共有 300 个 cookie,并且可能将每个 cookie 的大小限定为 4 KB。 
 * 浏览器通过向 HTTP 请求头添加字段将 cookie 返回给 servlet。
 * 可使用 HttpServletRequest#getCookies 方法从请求中获取 cookie。一些 cookie 可能有相同的名称,但却有不同的路径属性。
 * 浏览器通过向 HTTP 请求头添加字段将 cookie 返回给 servlet。可使用 HttpServletRequest#getCookies 方法从请求中获取 cookie。一些 cookie 可能有相同的名称,但却有不同的路径属性。
 * 此类支持版本 0(遵守 Netscape 协议)和版本 1(遵守 RFC 2109 协议)cookie 规范。默认情况下,cookie 是使用版本 0 创建的,以确保最佳互操作性。
 */
public class Cookie{
	//构造方法
	 public Cookie(String name, String value){}

	//常用方法
   String getComment() {}//获取注释信息
          
 	 String getDomain() {}
         
	 int getMaxAge() {}
	          
	 String getName() {}//没有setName的方法
	         
	 String getPath() {}
	         
	 boolean getSecure() {}
	          
	 String getValue() {}
	        
	 int getVersion() {}
	// -------------------------------------------
	 void setComment(String purpose) {}
	         
	 void setDomain(String pattern) {}
	        
	 void setMaxAge(int expiry) {}
	          
	 void setPath(String uri) {}
	          
	 void setSecure(boolean flag) {}
	          
	 void setValue(String newValue) {}
	          
	 void setVersion(int v) {}
}

 

 

public Cookie(String name,String value)
setValue与getValue方法 
setMaxAge与getMaxAge方法 ,单位是秒,如果不指定此属性则保存在浏览器内存中,如果设置了,则保存在浏览器缓存文件夹中,如果设置为0,则浏览器会删除同名cookie
setPath与getPath方法,控制浏览器什么时候带着此Cookie来访问,比如设置为/Day05则访问/Day05及其子路径时会带着cookie,如果没有设置path则,比如访问/Day05/servlet/Demo则默认为/servlet
setDomain与getDomain方法  .google.com 所有浏览器都拒绝接受第三方cookie,所以此方法基本上无用
getName方法 ,没有setName方法

 

 

 

/**
 * javax.servlet.http.HttpSession
 * 提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
 * servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。
 * 会话将保留指定的时间段,跨多个连接或来自用户的页面请求。
 * 一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。
 * servlet 应该能够处理客户端选择不加入会话的情况,比如故意关闭 cookie 时。
 */
public interface HttpSession{
	Object getAttribute(String name);
	void setAttribute(String name, Object value);
	void removeAttribute(String name);
	Enumeration getAttributeNames();
	
	long getCreationTime();//创建时间
	String getId();
	long getLastAccessedTime();
	int getMaxInactiveInterval();//得到最大不活跃间隔
	void setMaxInactiveInterval(int interval);
	
	ServletContext getServletContext();
	
	void invalidate();//让此Session作废
}

 

四、Cookie应用

 

  1. 显示用户上次访问时间,每次访问的时候将当前时间设置为cookie发给浏览器
  2. 显示用户上次浏览过的商品

     
  3. Cookie不接受中文,如果输入中文则设置不成功,不过可以进行URL编码,读取的时候进行解码就ok了
  4. String value = URLEncoder.encode("中文", "utf-8");
    cookie.setValue(value);//url编码并设置
    String value = c.getValue();
    value = URLDecoder.decode(date, “utf-8”);//url解码
     
  5. 注意,如果浏览器没有带Cookie过来则getCookies方法返回会是个null,要进行非空判断

五、Cookie细节

 

  1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)
  2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  3. 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  5. 注意,删除cookie时,path必须一致,否则不会删除(浏览器通过cookie的name+path来标识一个cookie)

六、session概述

 

  1. 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
  2. session是一个域对象,作用范围为整个会话。
  3. Session和Cookie的主要区别在于:Cookie是把用户的数据写给用户的浏览器。Session技术把用户的数据写到用户独占的session中。
  4. session的生命周期
  5. Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象,如果服务器发现内存中没有该浏览器对应的session就会创建该session并返回,如果已经存在则直接返回已有的session。
  6. session并不会一直存在在内存中,经过一段时间如果无人使用session将会被销毁,一般这个时间为30分钟,可以在web.xml中配置<session-config>设置该时间值
  7. 调用session的invalidate()也可以销毁session
  8. 使用Session完成简单的购物功能

七、session实现原理

 

  • 服务器是如何实现一个session为一个用户浏览器服务的?
  • 如何实现多个IE浏览器共享同一session?(应用:关掉IE后,再开IE,上次购买的商品还在。)
  • 多个IE浏览器共享同一session
  • 在简单购物案例中,由于一个浏览器对应一个Session,所以当我们重新开一个浏览器时,是无法找到在上一个浏览器中购买的商品的,这在电子商务中是无法接受的,其实我们可以利用session的原理巧妙的使同一台机器内的多个浏览器共用一个session
  • 由于服务器识别浏览器是通过Jsessionid这个特殊的cookie进行的,我们可以手动设置该cookie的setMaxAge,使这个cookie被保存在硬盘中被多个浏览器公用,从而使同一台机器上的多个浏览器公用一个session。(注意设置cookie值时path也要相同)。

八、IE禁用Cookie后的session处理

 

  • 注意:即使禁止了Cookie,浏览器对localhost是不阻止的,要想试验就要用127.0.0.1进行
  • ie6对localhost开头的不起作用,ie8是可以起作用的
  • 解决方案:URL重写
  • response. encodeRedirectURL(java.lang.String url) 
    用于对sendRedirect方法后的url地址进行重写。
    response. encodeURL(java.lang.String url)
    用于对表单action和超链接的url地址进行重写 

九、session案例 

 

  • 使用Session完成用户登陆(注销、*注册)
  • 利用Session防止表单重复提交
  • 方式一:利用javascript
    <script type="text/javascript">
    	var isCommited = false;
    	function checkPost(){
    		if(!isCommited){
    			isCommited = true;
    			return true;
    		}else{
    			alert("不能重复提交");
    			return false;
    		}
    	}
    </script>
     
  • 缺点:当用户单击”刷新”,或单击”后退”再次提交表单,将导致表单重复提交
  • 方式二:
  • 表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
  • 当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  • 在下列情况下,服务器程序将拒绝用户提交的表单请求:
  • ----存储Session域中的表单标识号与表单提交的标识号不同
  • ----当前用户的Session中不存在表单标识号
  • ----用户提交的表单数据中没有标识号字段

十、ServeltContext 、reqeust、session域的比较

 

  1. servletContext 的作用域是整个web应用,随着服务器启动而创建,如果应用被移除出主机或服务器关闭则销毁。
  2. request 的作用域是整个请求链,每一次请求都会创建一个request,当请求结束时request销毁。
  3. session 的作用于是整个会话,第一次调用reqeust.getSession时创建,当一段时间没有使用或服务器关闭或调用session.invalidate方法时销毁
  4. 什么时候用ServeltContext什么时候用reqeust什么时候用session?
  5. ----如果一个数据只是用来显示的话就用request域
  6. 如果一个数据除了用来显示以外我一会还要用,这时候用session
  7. 如果一个数据除了用来显示以外还要给别人用,这时候用ServletContext域
  • 大小: 16.5 KB
  • 大小: 26.8 KB
  • 大小: 28.4 KB
  • 大小: 22.8 KB
分享到:
评论

相关推荐

    hiro会话管理共12页.pdf.zip

    很抱歉,根据您提供的信息,"hiro会话管理共12页.pdf.zip"是一个压缩文件,其中包含一个名为"hiro会话管理共12页.pdf"的PDF文档,以及一个名为"赚钱项目"的文件。然而,由于我无法直接访问或解析这个压缩包的内容,...

    第12章 会话控制

    1. **Cookie**: 最常见的会话管理方式,服务器将一个唯一的会话ID存储在客户端的cookie中。每次请求时,浏览器自动附带cookie,服务器根据ID找到对应的会话数据。 2. **URL重写**: 如果担心cookie被禁用或不安全,...

    Oracle 12c资源管理器resource manager

    - **无法管理特定资源**:操作系统无法管理数据库的特定资源,如并行执行服务器和活动会话等。 为了解决这些问题,Oracle资源管理器应运而生。它可以按照数据库会话(sessions)的属性来划分会话用户组,并对会话组...

    外企日语会话宝典(生产管理篇).pdf

    12. 生产管理的挑战:生产管理的挑战包括生产计划的不确定性、生产过程的复杂性和生产资源的限制等。 13. 生产管理的UTURE发展:生产管理的UTURE发展趋势包括智能制造、工业互联网和绿色制造等。 14. 生产管理的...

    怎样查找锁与锁等待及杀特定会话

    当存在锁等待情况时,我们需要知道哪些会话锁定了表以及哪些会话正在等待这些锁。下面的SQL语句可以帮助我们找到这些信息: ```sql SELECT /*+RULE*/ LPAD('', DECODE(l.xidusn, 0, 3, 0)) || l.oracle_username ...

    JT会话管理器

    12. **测试**:对于任何软件,单元测试和集成测试都是必不可少的,以确保会话管理器的正确性和稳定性。这可能涉及到模拟网络环境、断言和覆盖率工具。 通过深入理解和实现"JT会话管理器",开发者可以提升在C++编程...

    JavaWeb12-文件上传.rar

    JavaWeb03-会话跟踪cookie与session.rar JavaWeb04-内置对象与include指令.rar JavaWeb05-购物车.rar JavaWeb06-Servlet.rar JavaWeb07-javaWeb模式.rar JavaWeb08-DBUtil.rar JavaWeb09-EL与JSTL.rar JavaWeb10-...

    MobaXterm_20.5官方版.zip_sessions99个

    MobaXterm是一款深受广大IT专业人员喜爱的全能终端软件,尤其在远程连接、SSH管理和多会话管理方面表现出色。这款工具集成了多种网络工具,如SSH、RDP、VNC、X11、telnet等,为用户提供了一站式的解决方案,使其能够...

    信息安全技术基础:会话层概述.pptx

    它的主要职责是为不同网络终端的应用进程提供会话管理与数据交换服务。这一层级的任务包括建立、控制、终止通信会话,确保数据的有序传输,并提供同步机制,以在通信过程中出现异常时能够从校验点恢复,这对于大文件...

    MobaXterm最新版

    在旧版本中,免费版的MobaXterm用户只能创建14个会话,这在处理多个项目或管理多个服务器时可能会感到不便。最新版取消了这一限制,用户可以根据需要创建任意数量的会话,轻松管理复杂的远程工作环境。 **自动保存...

    Oracle 12c资源管理器概念深入浅出

    - **内部工作负载管理**:资源管理器还能够在每个PDB内部管理资源分配,确保连接到PDB的每个会话都能得到公平且合理的资源分配。 - **资源分配流程**:资源管理器采用两步法分配资源: - 第一步是将一部分系统资源...

    Oracle 12c完整后台进程&内存结构图 DBA必备

    7. User Global Area (UGA):负责管理用户的会话信息。 8. Program Global Area (PGA):负责管理程序的全局信息。 9. Sort Area:负责管理排序操作的缓存。 10. Hash Area:负责管理哈希索引的缓存。 11. Bitmap ...

    Oracle12c CDB和PDB的参数文件管理

    ### Oracle12c CDB和PDB的参数文件管理 #### 一、Oracle12c多租户架构下的参数文件管理概述 Oracle Database 12c引入了多租户架构,其中包含容器数据库(Container Database, CDB)和可插拔数据库(Pluggable ...

    智能会话「Smart Sessions」-crx插件

    - 通过定期浏览管理您的会话 - 活动会话没有限制 - 恢复单个标签或整个会话 - 标记你的会话 - 按会话名称,网站网址或标题进行搜索 - 导出和分享您的会话 - 用作书签管理器(关闭自动跟踪,不会保存更改) --...

    citrix 中文管理操作手册

    管理用户会话和服务器进程 31 使用 Access Management Console 创建报告 31 使用 Access Management Console 配置应用程序访问权限 32 使用 Access Management Console 创建跟踪日志 32 查看 Citrix 修补程序信息 32...

    focus,用shiro和springboot搭建的权限管理系统,用户、角色、资源管理授权,细粒度到权限码.zip

    9. **会话管理**:Shiro提供了会话管理功能,可以跟踪用户会话,支持会话超时、会话绑定、跨域会话共享等。这对于保持用户状态和防止会话劫持非常重要。 10. **安全配置**:在SpringBoot项目中,Shiro的配置通常在...

    Oracle 12C CDB、PDB常用管理命令.docx

    可以使用 alter session 设置当前会话的容器: * alter session set container=orcl1; : 切换到 PDB orcl1 容器 * alter session set container=CDB$ROOT; : 切换到 CDB 容器 查看当前容器 可以使用以下命令来...

    PHP用户管理后台模块

    使用预编译语句(如PDO或mysqli)防止SQL注入,同时实现会话管理,以便在用户成功登录后跟踪其状态。 5. **会话管理**:PHP的`session_start()`函数用于开启会话,`$_SESSION`全局变量用于存储用户信息。会话超时...

Global site tag (gtag.js) - Google Analytics