细胞因子 mysql Angular combobox camera Semantic UI android项目实战 jmeter性能测试视频 jquery的点击事件 jquery解析json linux环境变量生效 spark大数据处理技术 js教程文档 windows杀进程命令 mysql卸载工具 mysql时间戳转时间 docker启动命令 python类 python连接mysql数据库 python命令大全 java数组扩容 java学习教程 javastring类型 java时间类 java入门课程 java集合转数组 java时间转换 java特性 linux密码忘记 神龙激活 python的用途 魔兽七个人 python电子书 win10wifi 电脑书籍下载 灰色按钮激活精灵 苹果手机不弹出信任 0x000007a g4560配什么显卡 苹果x怎么用
当前位置: 首页 > 学习教程  > 编程语言

小饶学编程之JAVA SE第二部分——Java Web 技术:15会话管理

2020/12/28 19:25:42 文章标签:

会话管理1、Http协议2、会话3、会话跟踪技术3.2、查询字符串3.3、表单隐藏域3.4、 Session3.4.1、session常用方法3.4.2、session的销毁3.4.3 、使用Session保存登录账号信息3.4.4、Session总结3.5、Cookie3.5.1、啥是Cookie?3.5.2、向客户端添加Cookie3.5.3、Cooki…

会话管理

      • 1、Http协议
      • 2、会话
      • 3、会话跟踪技术
        • 3.2、查询字符串
        • 3.3、表单隐藏域
        • 3.4、 Session
          • 3.4.1、session常用方法
          • 3.4.2、session的销毁
          • 3.4.3 、使用Session保存登录账号信息
          • 3.4.4、Session总结
        • 3.5、Cookie
          • 3.5.1、啥是Cookie?
          • 3.5.2、向客户端添加Cookie
          • 3.5.3、Cookie年龄的设置
          • 3.5.4、获取Cookie
          • 3.5.5、使用Cookie实现七天免登录
          • 3.5.6、Cookie总结
        • 3.6、url重写

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是一种无状态协议,每当用户发出请求时,服务器就做出响应,客户端与服务器之间的联系是离散的、非连续的。每当用户在同一个网站的多个页面之间转换时,根本无法知道是否是同一个客户,会话跟踪就可以解决这个问题。当一个客户在多个页面之间切换时,服务器会保存该用户的信息。会话跟踪技术分:查询字符串、表单隐藏域、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参数(如果需要)。


本文链接: http://www.dtmao.cc/news_show_550251.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?