会话跟踪之Session
Session是服务端使用记录客户端状态的一种机制,Session使用简单,但是和Cookie相比,增加了服务器的存储压力【因为为了追求速度,服务器将Session放置在了内存中】。Cookie是保存在客户端的,然而Session是保存在服务器上的。初次访问的服务端的时候会把客户端的信息保存起来,再次访问的时候直接从Session中获取即可。【客户端初次访问服务器的时候会自动创建Session,如果没有生成Session则可以使用request.getSession(true)方式强制生成Session】
但是值得注意的是,Session的使用需要Cookie的支持,因为单独的Session还是无法知道当前访问服务器的是否是同一个客户端,它要根据存储在Cookie中的JSESSIONID来进行判断[这个Cookie是客户端自动创建的],如果客户端关闭了Cookie,那么Session是没有什么效果的。这个时候,需要使用URL重写的方式,将JSESSIONID直接放置在URL中,访问服务器的时候可以直接进行解析。
大家都知道Cookie是可以设置过期时间的,它允许设置永久有效,并且它是存储在客户端电脑上的,并不会占用服务器的内存。所以如果想实现"永久登录"的话,使用Cookie是首选,并且Cookie中可以通过设置domain属性,来达到跨域使用[多个窗口公用Cookie]。然而Session需要占用太多的服务器内存,并且不支持跨域使用,不同的窗口访问客户端都会创建一个Session,Session过多会造成内粗溢出【当然服务端也有相应的措施应对溢出,那就是通过设置Session的有效期,有效期到达之后就会将Session清除】
但是Session中可以存储多种类型的数据,不仅能存储String还可以直接存储一个javaBean对象,然而Cookie中仅仅能存储String。并且Session的安全性要比Cookie的安全性高的多,因为它是存储在服务器上的,外部人员不能轻易更改,然而Cookie是保存在客户端电脑上的,随时都有可能被更改,虽然说可以将信息加密,然后存储在Cookie中,但是跟Session相比,安全性还是比较低的。
所以通常"会话跟踪"的时候,通常是两者配合使用以达到想要的效果!
*:通常利用Session保存当前登录用户的信息,我们可以操作Session(如:移除Session中的userInfo或者设置Session失效),当Session中没有userInfo则跳转到登录界面进行登陆操作【也就意味着该用户已经下线】,所以通常都是操作Session来进行【踢出用户】操作,使用户被迫下线。
一:代码演示:利用Session存储用户信息,然后在欢迎界面获取用户信息【此处登录界面和欢迎界面是一个】
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>演示Session的使用</title>
</head>
<body>
<!-- 利用JSP的行为创建一个User实例 ,存放在默认的page域中-->
<jsp:useBean id="user" class="cn.woo.entity.User" scope="page"></jsp:useBean>
<jsp:setProperty property="username" name="user" value="woo"/>
<jsp:setProperty property="password" name="user" value="123456"/> <%!
//定义要显示的错误提示信息
String message = "";
//登录标志
boolean login = false;
%> <!-- 接收请求 -->
<%
System.out.println(request.getMethod());
if(request.getMethod().equalsIgnoreCase("post")){
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8"); //获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password"); //验证用户名和密码是否正确
if((username!=null && !username.isEmpty()) && (password!=null && !password.isEmpty())){
if((username.equals(user.getUsername())) && (password.equals(user.getPassword()))){
login = true;
//利用Session记录用户信息
session.setAttribute("userInfo",user);
//重定向至该页面,添加参数System.currentTimeMillis(),防止客户端缓存页面数据
response.sendRedirect(request.getRequestURI()+"?"+System.currentTimeMillis());
return;
}else{
message = "用户名密码错误请重新登录";
}
}else{
message = "用户名和密码不能为空";
}
}else{
message = "请先登录";
}
%> <%
if(login){
%>
<!-- 利用EL表达式获取存放在Session中的userInfo -->
<p style="width:200px;height:200px;border:1px solid black;margin:100px auto;line-height:200px;text-align:center;">欢迎:<span>${userInfo.username}</span></p>
<%
}else{
%>
<!-- 登录界面 -->
<form action="<%=request.getRequestURI()+"?"+System.currentTimeMillis()%>" method="post">
<table>
<tr>
<td colspan="2"><%=message %></td>
</tr>
<tr>
<td align="right"><label for="name">用戶名:</label></td>
<td><input type="text" name="username" id="name"></td>
</tr>
<tr>
<td align="right"><label for="pwd">密码:</label></td>
<td><input type="password" name="password" id="pwd"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
<%
}
%>
</body>
</html>
下方图片就是服务端需要的Cookie,可以看到Cookie中存放了一个JSESSIONID:
二:有时候客户端不支持Cookie,或者说客户端禁用Cookie,这个时候可以使用URL重写的方式,添加JSESSIONID到URL中,一并发送到服务器:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>演示Session的使用</title>
</head>
<body>
<!-- 利用JSP的行为创建一个User实例 ,存放在默认的page域中-->
<jsp:useBean id="user" class="cn.woo.entity.User" scope="page"></jsp:useBean>
<jsp:setProperty property="username" name="user" value="woo"/>
<jsp:setProperty property="password" name="user" value="123456"/> <%!
//定义要显示的错误提示信息
String message = "";
//登录标志
boolean login = false;
%> <!-- 接收请求 -->
<%
System.out.println(request.getMethod());
if(request.getMethod().equalsIgnoreCase("post")){
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8"); //获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password"); //验证用户名和密码是否正确
if((username!=null && !username.isEmpty()) && (password!=null && !password.isEmpty())){
if((username.equals(user.getUsername())) && (password.equals(user.getPassword()))){
login = true;
//设置Session的有效期,单位为s
session.setMaxInactiveInterval(30*60);
//利用Session记录用户信息
session.setAttribute("userInfo",user);
//重定向至该页面,添加参数,放置客户端缓存页面数据
//response.sendRedirect(request.getRequestURI()+"?"+System.currentTimeMillis());
//客户端不支持Cookie或者关闭Cookie的时候使用该方式进行URL的重写
response.encodeRedirectURL(request.getRequestURI()+"?"+System.currentTimeMillis());
return;
}else{
message = "用户名密码错误请重新登录";
}
}else{
message = "用户名和密码不能为空";
}
}else{
message = "请先登录";
}
%> <%
if(login){
%>
<!-- 利用EL表达式获取存放在Session中的userInfo -->
<p style="width:200px;height:200px;border:1px solid black;margin:100px auto;line-height:200px;text-align:center;">欢迎:<span>${userInfo.username}</span></p>
<%
}else{
%>
<!-- 登录界面 -->
<!-- 客户端不支持Cookie或者关闭Cookie的时候使用该方式进行URL的重写
response.encodeURL(request.getRequestURI()+"?"+System.currentTimeMillis())
-->
<form action="<%=response.encodeURL(request.getRequestURI()+"?"+System.currentTimeMillis()) %>" method="post">
<table>
<tr>
<td colspan="2"><%=message %></td>
</tr>
<tr>
<td align="right"><label for="name">用戶名:</label></td>
<td><input type="text" name="username" id="name"></td>
</tr>
<tr>
<td align="right"><label for="pwd">密码:</label></td>
<td><input type="password" name="password" id="pwd"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="登录"></td>
</tr>
</table>
</form>
<%
}
%>
</body>
</html>
点击登录的时候会清晰的看到URL的内容变化,中间包含jsessionid
http://localhost:8080/JSPDemo/session.jsp;jsessionid=D01238B61D0544108E0C04AA5E17EE6C?1534577455038
通常Cookie被禁用的方式很常见,所以一般都是禁用Cookie然后,直接同意采用URL重写的方式进行Session的使用:
【Session中禁用Cookie的方式】:
会话跟踪之Session的更多相关文章
- 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式
解释HTTP HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否 ...
- 会话跟踪技术——Session
一.什么是Session Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期.在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分. Se ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 设置Session存活时长
方式一:修改所有的session默认时长,修改tomcat目录下的conf文件夹下的web.xml文件. <session-config> <session-timeout>希 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 获取Session对象
Session对象的获取有两种: ● 有参方法: HttpSession request.getSession(boolean isNew) 参数: true:获取一个Session对象,如果之前S ...
- JSP基础--会话跟踪技术、cookie、session
会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...
- Django - cookies 会话跟踪技术
一.HTTP协议的无状态保存 两次请求之间没有关联 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2.会话路径技术使用Cookie或session完成 我们知道HTTP ...
- 04-cookies 会话跟踪技术
1.会话跟踪技术 1.Http协议的无状态保存 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2 .会话路径技术使用Cookie或session完成 我们知道HTTP协 ...
- JavaWeb04-JSP及会话跟踪技术
JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 1.2 JSP的 ...
- 会话跟踪session cookie
会话跟踪 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在 ...
随机推荐
- 关于SCANF 与 GETS(C语言)
SCANF遇到空格会自动停止录入字符串,而GETS不会,GETS可以用于输入带空格的字符串
- 5.5 Ubuntu无法访问windows上的文件
比如,我的文件都放在win10桌面上的Tools文件夹中,那么在Ubuntu中访问如下:当然,sunny在点击这个磁盘时,遇到了没有访问权限的问题. 解决方案:参考网址http://blog.csdn ...
- ant安装和配置
一.安装ant到官方主页http://ant.apache.org下载新版(我用的1.9.2)的ant,得到的是一个apache-ant-1.9.2-bin.zip的压缩包.将其解压到你的硬盘上,例如 ...
- code first迁移和部署
从"工具"菜单中,选择"NuGet 包管理器" > "包管理器控制台". 在PM>提示符处输入以下命令: enable-migr ...
- 【C#】截取字符串
几个经常用到的字符串的截取 string str="123abc456"; int i=3; 1 取字符串的前i个字符 str=str.Substring(0,i); // or ...
- CentOS常用软件安装方法
软件包介绍 源码包(脚本安装包) 二进制包(RPM包,系统默认包) 源码包 优点 开源,如果有足够的能力,可以修改源代码 编译安装,更加适合自己的系统,稳定高效 缺点 安装步骤较多,容易出错 编译过程 ...
- wxpython实现文件拖拽
我想让wx.grid里面的单元格能够支持文件拖拽,实现起来挺简单的,共分3步: 1.创建一个wx.FileDropTarget子类的对象,并把要支持拖拽的控件传给它的构造函数,此处是grid 2.调用 ...
- 浅谈UML——九种图(一)
前言 学UML将近两个星期了,对UML有了一定的了解,学过的没学过的都知道UML中最最最核心的部分要数那九个图了.浅谈UML九种图. 实例 1.用例图: 什么是用例?描绘一个系统外在可见的需求情况,是 ...
- 洛谷P3694 邦邦的大合唱站队/签到题
P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- [Xcode 实际操作]四、常用控件-(12)环形进度条控件的使用
目录:[Swift]Xcode实际操作 本文将演示环形进度条控件的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vi ...