javaweb之会话管理

javaweb之会话管理会话管理 HTTP 是无状态的协议 每次客户端访问 web 页面时 都会打开一个单独的连接到 web 服务器 服务器不会自动保存客户端请求的任何记录 需要使用 cookie 和 session 来将一系列的请求和响应关联起来 维持客户端和服务器之间的会话 coo

大家好,欢迎来到IT知识分享网。

javaweb之会话管理

会话管理

HTTP是无状态的协议,每次客户端访问web页面时,都会打开一个单独的连接到web服务器,服务器不会自动保存客户端请求的任何记录,需要使用cookie和session来将一系列的请求和响应关联起来,维持客户端和服务器之间的会话

cookie

Cookie是存储在计算机上的文本文件,用于追踪各种信息,记录在客户端,浏览器可以禁用cookie,可以删除cookie, 在服务器产生,作为响应头的一部分返回给客户端,浏览器收到cookie后,把cookie的键值写入到文本中,发送请求时浏览器会把cookie信息与请求发送给服务器

cookie原理

底层原理:WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求信息中增加Cookie请求头字段将Cookie回传给WEB服务器

操作cookie

创建cookie

// 第一个参数是cookie的键,第二个参数是cookie的值 Cookie cookie = new Cookie("name","value") resp.addCookie(cookie) 

获取cookie

Cookie[] cookies = req.getCookies(); 

设置cookie的一些方法

// 描述cookie的注释 public void setComment(String purpose) { this.comment = purpose; } // 设置cookie适用的域名 public void setDomain(String pattern) { this.domain = pattern.toLowerCase(Locale.ENGLISH); } // 设置过期时间(单位是秒),如果不设置,cookie在当前session中有效 // 如果设置生命周期会写在文件里 // 如果不设置生命周期会写在浏览器内存里,窗口关闭,cookie就没了 public void setMaxAge(int expiry) { this.maxAge = expiry; } // 设置cookie适用的路径,如果不指定,在当前目录及其子目录的URL下会返回cookie,request.getContext public void setPath(String uri) { this.path = uri; } // 是否只在加密的连接上(SSL)发送 public void setSecure(boolean flag) { this.secure = flag; } // 设置cookie值 public void setValue(String newValue) { this.value = newValue; } public void setVersion(int v) { this.version = v; } 

获取cookie属性的方法

// 获取cookie的注释,如果没有为null public String getComment() { return this.comment; } // 获取cookie适用的域名 public String getDomain() { return this.domain; } // 获取cookie过期时间,如果为-1,cookie表示持续到浏览器关闭 public int getMaxAge() { return this.maxAge; } // 获取cookie适用的路径 public String getPath() { return this.path; } // 获取是否只在加密的连接上发送 public boolean getSecure() { return this.secure; } // cookie的名称,创建后不可修改 public String getName() { return this.name; } // 获取cookie值 public String getValue() { return this.value; } public int getVersion() { return this.version; } 

删除cookie

设置生命周期 cookie.setMaxAge()方法设置,秒为单位,若为0,表示立即删除该cookie,将该cookie放到响应中返回

注意:一个servlet设置的cookie可以被同一个路径下或者子路径下的servlet读到,其他访问不到

路径是指url可以通过cookie.setPath()方法设置cookie的作用范围

cookie适用场景

  • 自动登录,不需要填写用户名和密码
  • 浏览记录

浏览器对于cookie是有限制的,同一域名下的cookie数量不能超过20个

session

session是记录在服务器端,获取session需要把sessionId传递给服务端,通过sessionId来取到对应的session,关闭浏览器,session不会被销毁,还可以通过sessionId找到该session,在同一个application下的servlet/jsp可以共享一个session,前提是同一个客户端窗口

操作session

创建或获取session

// 若为false,如果当前没有关联的session,如返回null;若为true,如果没有则会创建 默认是true HttpSeesion session = request.getSession(true); 

session的相关方法

// 返回session的创建时间(单位毫秒) long getCreationTime(); // 获取sessionId String getId(); // 返回客户端最后一次发送与该session会话相关的请求的时间(单位毫秒) long getLastAccessedTime(); ServletContext getServletContext(); // session的过期时间,单位秒 // 也可以在web.xml中设置过期时间,单位为分钟,tomcat默认是30分钟 // 
  
    // 
   
     // 
    
   void setMaxInactiveInterval(int var1); // 返回servlet容器在客户端访问时保持session会话打开的最大时间间隔,单位秒 int getMaxInactiveInterval(); // 返回seesion会话中该名称的对象,没有返回null Object getAttribute(String var1); // 返回该session会话中所有的名称 Enumeration 
  
    getAttributeNames(); // 将对象绑定到该session会话中 void setAttribute(String var1, Object var2); // 移除指定名称的对象 void removeAttribute(String var1); // 使该session无效 void invalidate(); // 是否为新创建的session(客户端还不知道该session) boolean isNew(); 
  
// 判断当前请求的session是否合法 req.isRequestedSessionIdValid(); // 判断当前请求是不是从URL发出的 req.isRequestedSessionIdFromURL(); // 判断当前请求是不是从cookie发出的 req.isRequestedSessionIdFromCookie(); 

session的超时时间

可以在web.xml中配置session的超时时间

 
   
   
     30 
    
   

session的实现方式

session有两种实现方式 通过cookie来实现 第一次请求时,响应在响应头set-Cookie中 有jsessionId,把jsessionId放到cookie中,如果浏览器支持cookie,会把jsessionId放到cookie中 默认是存储在内存中的,没有存储在磁盘上,关闭浏览器就会失效 可以进行持久化,使用cookie.setMaxAge

通过URL重写来实现 response.encodeURL两个作用

  • 转码
  • URL后加上jsessionID

session的持久化

由于session会占用内存资源,可以将session进行持久化放到文件或者数据库中保存,Tomcat中使用
org.apache.catalina.session.PersistentManager和
org.apache.catalina.session.StandardManager两个类来管理session的持久化

StandardManager

StandardManager是在web应用程序关闭时,对内存中的所有HttpSession对象进行持久化,保存在文件系统中,默认位置为tomcat下的

\work\Catalina\ 
  <主机名>
    \ 
   <应用程序名>
     \SESSION.ser 
    
  

PersistentManager

PersistentManager比StandardManager更加灵活,只要某个设备提供了实现org.apache.catalina.Store接口,就可以将HttpSession对象保存到对应的设备下

配置方式为

 
   
    
  

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/173331.html

(0)
上一篇 2025-03-13 09:00
下一篇 2025-03-13 09:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信