JavaWeb-会话管理

1、Http协议

何谓协议?就是指双方遵循的规范。http协议,就是浏览器和服务器之间进行“沟通”的一种规范。我们在看空间,刷微博…都是在使用http协议,当然,远远不止这些应用。

大学的时候,我们学习计算机时,老师一般跟我们讲过TCP/IP协议和UDP协议。TCP协议是一种可靠协议,即数据包不会丢失;UDP是一种不可靠协议,丢失几个数据包对它来说无关紧要。

很明显,UDP协议不符合Web应用的需求。

而TCP协议是基于连接和三次握手的,虽然具有可靠性,但人具有一定的缺陷。但试想一下,普通的C/S架构软件,顶多上千个Client同时连接,而B/S架构的网站,十万人同时在线也是很平常的事儿。如果十万个客户端和服务器一直保持连接状态,那服务器如何满足承载呢?

这就衍生出了http协议。基于TCP的可靠性连接。通俗点说,就是在请求之后,服务器端立即关闭连接、释放资源。这样既保证了资源可用,也吸取了TCP的可靠性的优点。

正因为这点,所以大家通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了啥”,其实很大程度上是基于性能考虑的。

所以,Http是无状态的。

2、会话

  • 用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话。
  • 每个用户在使用浏览器与服务器会话的过程中,会产生一些用户数据,如用户登陆标记,WEB应用程序必须要为每个用户在一次或多次会话过程中保存这些数据,如何解决?

3、会话跟踪技术

HTTP是一种无状态协议,每当用户发出请求时,服务器就做出响应,客户端与服务器之间的联系是离散的、非连续的。每当用户在同一个网站的多个页面之间转换时,根本无法知道是否是同一个客户,会话跟踪就可以解决这个问题。当一个客户在多个页面之间切换时,服务器会保存该用户的信息。

3.1、会话跟踪技术分类
  • 查询字符串
  • 表单隐藏域
  • Session
  • Cookie
  • URL重写
3.2、查询字符串

一般在向服务器发起get请求的时候?后面的字符串会被解析为查询字符串,格式一般是URL?key=value&key2=value2,后端服务会解析这些字符串,转为一系列的值键对当然你用传统表单的get方法,使用默认行为也会向action的url发送?name=val的请求,这些应该来说是约定俗成的。

URL?name=value&name=value&name=value....
3.3、表单隐藏域

将字段隐藏在HTML表单中,但不在客户端显示。比如在第一张页面中输入用户名和密码登陆,服务器生成响应返回第二张页面。当第二张页面提交时可能仍然需要知道来自第一张页面中的用户名。那么就可以通过隐藏表单域来实现这一连续的过程。当第一张页面提交后,服务器端作出响应返回第二张页面,此页面中用隐藏域记录了来自登陆时的用户名。

在form表单中添加对应隐藏域

<input type=“hidden” name=“username” value=“Sunny”>

在请求中获取值

String name = request.getParameter(“username”);
3.4、 Session

Session是会话的意思。

HttpSession接口实现了会话机制,并用Session来跟踪客户的状态。Session是在一段时间内,单个客户与Web服务器的一连串的相关的交互过程。在一个Session中客户可能会多次请求访问同一个页面,也有可能请求访问不同的服务器资源。

Session原理:WEB容器为每个客户端会提供一个session,当调用相应的方法时,该session就会产生,并同时产生一个唯一的session ID,通过Cookie发送到客户端进行保存,并可以向session里存数据(对象),那么该客户端在由该页面跳转到 下一个页面后,就可以把前面页面中向session中共享的数据取出来。

3.4.1、session常用方法

得到与当前请求相关联的Session:request.getSession(无参/true/false)

request.getSession(无参/true)

该方法先查看有没有与当前请求相关联的会话对象,如果有,直接返回该会话对象,如果没有,该方法将会新创建一个会话对象并返回

request.getSession(false)

没有与请求相关联的会话,则该方法不会创建新的会话,直接返回null

得到session的唯一标识ID号:session.getId()

得到session的创建时间:session.getCreationTime()

上次访问时间:session.getLastAccessedTime()

得到最大活动时间(生存时间):session.getMaxInactiveInterval()

设置最大活动时间(生存时间):session.setMaxInactiveInterval(int秒)

不设置,默认为30分钟 -1为永不过期

共享数据:session.setAttribute(“name”,”value”);

取出数据:session.geAttribute(“name”)

3.4.2、session的销毁
  1. web.xml中配置session超时(tomcat的全局web.xml、项目级别的web.xml)
<session-config>
    <session-timeout>(分钟数)</session-timeout>
</session-config>

或者在代码中设置超时:

session.setMaxInactiveInterval(30*60// 单位秒

优先级为:

​ 代码中的setMaxInactiveInterval > 项目级别的web.xml > tomcat的全局web.xml

  1. session.invalidate(); 让session内容全部清除
  2. 服务器关闭
3.4.3 、使用Session保存登录账号信息
3.4.4、Session总结
1. 所有session存在服务器端,耗服务器资源
2. Session中的数据是对同一个浏览器窗口有效,如果客户端重新打开一个窗口访问WEB程序,则在第一个窗口中的Session中共享的数据在第二个窗口中取不到
3. sessionID是通过Cookie传递的,如果客户端禁止了Cookie则无法传递sessionID
3.5、Cookie
3.5.1、啥是Cookie?
  • Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问 Cookie 信息 。
  • 目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除 。
  • 原理:将一个文本文件写入客户端的硬盘中,将要记住的内容以键值对的形式写在文本文件中 。
3.5.2、向客户端添加Cookie
String nameKey = URLEncoder.encode("姓名", "utf-8")   ;// cookie保存中文报错
String nameValue = URLEncoder.encode("张三", "utf-8")   ;// cookie保存中文报错
		
Cookie cookie = new Cookie(nameKey, nameValue);
cookie.setMaxAge(60);// 秒
response.addCookie(cookie);
3.5.3、Cookie年龄的设置
  • 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。

  • 如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。默认为–1。

  • 如果为0,表示删除该Cookie。

  • 设置Cookie永不过期: 设置年龄为Integer.MAX_VALUE

3.5.4、获取Cookie
	Cookie [] cs = request.getCookies();
		if(cs!=null){
			for(Cookie c: cs){
			// URLDecoder.decode解决中文存取的问题
			String cookieKey = URLDecoder.decode(c.getName(), "utf-8");
			String cookieValue = URLDecoder.decode(c.getValue(), "utf-8");
            }
		}
	}

3.5.5、使用Cookie实现七天免登录
3.5.6、Cookie总结
1. 只能往Cookie中写字符串,不能放对象
2. 放在客户端不安全
3. 一个WEB程序只支持200多个Cookie
4. 客户端可以禁止Cookie
3.6、url重写

用途:解决客户端禁止了Cookie要传Session ID的问题。
原理:将session ID添加到URL的后面,类似查询字符串的方法。
方法:

HttpServletResponse:

String encodeURL(String url) 重写给定的url,包含sessionID
String encodeRedirectURL(String url) 使用sendRedirect方法时,重写给定的url,包含sessionID

	String newUrl = resp.encodeURL(req.getContextPath()+"/new.jsp");
	resp.sendRedirect(newUrl);

这2个方法只有在客户端禁用了cookie才会生效。

共同点:

都对url附加上jsessionid参数进行了处理,如果需要,则在url的path后面附加上;jsessionid=xxx;如果不需要则直接返回传入的url。

不同点:
encodeURL在附加jsessionid之前还对url做了判断处理:如果url为空字符串(长度为0的字符串),则将url转换为完整的URL(http或https开头的);如果url是完整的URL,但不含任何路径(即只包含协议、主机名、端口,例如http://127.0.0.1 ),则在末尾加上根路径符号/。
也就是encodeURL如果进行了编码,则返回的URL一定是完整URL而不是相对路径;而encodeRedirectURL则不对URL本身进行处理,只专注于添加jsessionid参数(如果需要)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值