session是什么哟?能不能说点人话!听都听不懂
我:请看VCR。
先看这一篇:xxx彻底弄清楚session是什么?-CSDN博客
session相关知识?
我:请看VCR。
Session详解,学习 Session对象一篇文章就够了_session撖寡情-CSDN博客
一.session
1.Session的定义
【官方解释】:一次浏览器与服务器交互的会话
【我的理解】:咱们知道,浏览器一般使用http协议打开一个网页。而http协议是无状态的,就是说每次请求没有关联。那我如果想在两个网页同时登陆,通过使用cookie可以做到,但是cookie在客户端,不安全。所以这个时候我们需要用到session。session在服务端,相对来说更安全。session可以在保证安全性的前提下将两个网页联系起来。
如果你还是没有理解,我建议你看一下我分享的第一个链接,这兄弟真的有点东西。
那什么才叫一次会话呢?
- 一般多数情况下,是这样描述的:用户打开浏览器,在浏览器上进行一些操作,然后将浏览器关闭,表示一次会话结束。
- 本质上的描述:从session对象的创建,到最终session对象超时之后销毁,这个才是真正意义的一次完整会话。
2.Session是用来干嘛的
<1>Session用来保存用户的各种信息
<2>通过session来判断该用户是否为合法用户
<3>在服务器上,通过session来区分每一个用户。用户只要一访问到一个有效的页面,立马分配一个session给用户
sessionid是什么东西?用来干嘛?
sessionid是用标识和绑定用户,来标识到底是哪个用户发的请求。就比如说每个学生都有一个特属于自己的学号,每个人都不一样,老师一看这个学号就晓得是你。跟数据库中表格主键的作用差不多。服务器一看这个sessionid就晓得哪几次请求是你发的,就晓得,哦,原来这是一次会话发了多次请求。
3.Session的运行机制
当用户进入浏览器访问页面,如果开启了session【即session_start()】,会自动生成sessionid作为这次会话的标注,同时也会自动往cookie里写入一个名字为PHPSESSION的变量,它的值正是session_id。如果当前会话并未结束,而你再次访问,服务器会先读取cookie的PHPSESSION,如果有值,直接使用这个cookie的PHPSESSION里的sessionid。如果没有值,就会新生成一个session_id,同时生成cookie的PHPSESSION。它的存活期就是在这个会话里,所以浏览器一关闭,这次session结束了,sessionid就也不存在了。
1、获取sessionId:session.getId()
<h1>SESSIONID : <%=session.getId()%></h1>
<h1>SESSIONID LENGTH : <%=session.getId().length()%></h1>
2、判断是否是新的session: public boolean isNew()
<%@page contentType="text/html;charset=gb2312"%>
<%//session的sessionid和系统cookie的sessionid比较
if(session.isNew())
{
%>
<h1>您是新的session</h1>
<%
}
else
{
%>
<h1>您不是新的session</h1>
<%
}
%>
<%
// 使session失效
//session.invalidate() ;
%>
3、session的属性设置
设置属性: public void setAttribute(String name,Object value)
取得属性: public Object getAttribute(String name)
删除属性: public void removeAttribute(String name)
4、用户注销: public void invalidate()
5、得到session的创建时间: public long getCreationTime() 此方法返回long类型,通过Date类可以取得一个完整的时间
6、取得用户最后一次操作的时间: public long getLastAccessedTime()
#session.jsp
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="java.util.*"%>
<%
long l1= session.getCreationTime() ;
long l2 = session.getLastAccessedTime() ;
%>
<h1>session CREATE : <%=new Date(l1)%></h1>
<h1>session last access: <%=new Date(l2)%></h1>
<h1><%=(l2-l1)/1000%></h1>
4.Session的保存
语法:setAtrribute(属性名,object)
sessionid是32位的,会通过“sess_前缀 + session_id”的形式保存在服务器端的tmp目录下,而正因为它保存在服务器端,才保证了它的安全性。
5.Session的漏洞
用户下线后,session15分钟之后才会销毁
6.Session的生命周期
什么时候创建:用户第一次访问服务器时创建
什么时候销毁:
(1)调用session的invalidate()方法后,session销毁。
(2)session在一定时间内没有活动,服务器会自动销毁session,默认时间为30分钟。2
(3)浏览器或项目关闭后,session销毁。
注意:用户访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建session。session可通过调用request.getSession(true)强制生成。
7.Session的销毁
-
关闭服务器,因为session存活在服务器端,一关闭服务器就销毁了
- session默认等待30分钟自动销毁
- 设置一个过期时间
session.setMaxInactiveInterval(5); //5秒后自动销毁
- 立刻失效
session.invalidate();
- web.xml文件配置
<session-config>
<session-timeout>10</session-timeout> //10分钟后销毁
</session-config>
8.session的应用
#login.jsp
<%@page contentType="text/html;charset=gb2312"%>
<form action="login.jsp" method="post">
用户名:<input type="text" name="uname"><br>
密码:<input type="text" name="upass"><br>
<input type="submit" value="登陆">
</form>
<%
// 判断是否有请求内容
// 在自提交的页面中,必须对程序第一次运行做出处理
if(request.getParameter("uname")!=null&&request.getParameter("upass")!=null)
{
// 第一次的时候,并不能取得请求的参数
String name = request.getParameter("uname") ;
String password = request.getParameter("upass") ;
System.out.println("name:"+name) ;
System.out.println("password:"+password) ;
if(name.equals("admin")&&password.equals("admin"))
{
// 表示登陆成功
// 通过flag属性判断用户是否已经登陆
session.setAttribute("flag","ok") ;
// 跳转到sucess.jsp
//response.sendRedirect("sucess.jsp") ;
%>
<jsp:forward page="sucess.jsp"/>
<%
}
else
{
response.sendRedirect("error.jsp");
}
}
%>
#success.jsp
<%@page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>sucess</title>
</head>
<body>
<h1>登录成功</h1>
<h2><a href="transfer.jsp">转账</a></h2>
</body>
</html>
#transfer
<%@page contentType="text/html;charset=gb2312"%>
<%--
用户必须先登陆之后,才能访问此页面
如果用户没有登陆,则提示用户回去重新登陆
--%>
<%
if(session.getAttribute("flag")!=null)
{
// session被设置过,正常登陆过
%>
<h1>转账成功!!!</h1>
<h2><a href="logout.jsp">注销</a></h2>
<%
}
else
{
// 两秒后跳转到login.jsp页面之中
response.setHeader("refresh","2;URL=login.jsp") ;
%>
<h1>您还未登陆,请先登陆!!!</h1>
<%
}
%>
#logout.jsp
<%@page contentType="text/html;charset=gb2312"%>
<%
// 使session失效
session.invalidate() ;
%>
<a href="transfer.jsp">transfer.jsp</a>
#error.jsp
<%@page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>error</title>
</head>
<body>
<h1>登录失败</h1>
<%
response.setHeader("refresh","2;URL=login.jsp");
%>
</body>
</html>
二、HttpSession
1.HttpSession的定义
HttpSession是Java Servlet规范中定义的一个接口,用于在客户端和服务器之间维护会话状态。我们从命名看出,它肯定是支持http协议的。它提供了一系列方法来操作会话数据,如setAttribute()、getAttribute()、removeAttribute()等。
2.HttpSession对象的创建
如果说cookie是把会话状态保存在客户端,那么HttpSession就是把会话状态保存在服务端。
当客户端发送第一个请求时,服务器会自动创建一个HttpSession对象,并将其与客户端关联起来。可以通过HttpServletRequest的getSession()方法来获取当前请求的HttpSession对象。
HttpSession一般不存放业务数据,一般存放用户登录信息
3.HttpSession的使用
将数据存储到HttpSession对象中
session.setAttribute("key",value)
根据key获取HttpSession中的数据,返回Object
Object value = session.getAttribute("key")
获取HttpSession中所有的key,返回枚举类型
Enumeration<String> attributeNames = session.getAttributeNames()
根据key删除HttpSession中的数据
session.removeAttribute("key")
根据获取当前HttpSession的SessionID,返回字符串类型
String id = session.getId()
4.HttpSession的销毁方式
- 通过web.xml文件指定超时时间
- 通过HttpSession对象中invalidate()方法销毁当前HttpSession对象
5.HttpSession会话ID
每个HttpSession对象都有一个唯一的会话ID,用于标识该会话。会话ID通常通过Cookie或URL重写的方式发送给客户端,并在后续的请求中被客户端发送回服务器。
6.HttpSession会话超时
HttpSession对象有一个超时时间,表示该会话在一段时间内没有活动后将被销毁。可以通过设置web.xml文件或使用setMaxInactiveInterval()方法来配置会话超时时间。
7.HttpSession会话管理
服务器通常使用一个会话管理器来管理所有的HttpSession对象。会话管理器负责创建、销毁和维护会话对象,并提供一些额外的功能,如集群环境下的会话复制。
8.HttpSession会话共享
在集群环境中,多个服务器可能需要共享会话数据。可以通过配置会话复制或使用外部存储来实现会话共享。
9.HttpSession生命周期
创建:第一次调用getSession(true)方法
销毁:超时(30分钟)或者调用invalidate()方法
10.HttpSession VS cookie
HttpSession存储在服务端,而cookie存储在客户端
HttpSession存储在服务端,安全性更高,而cookie存储在客户端,,安全性较低
HttpSession存储数据没有容量限制,而cookie单个存储的话不能超过4K。
11.HttpSession的isNew()
功能:判断是否是新用户。【是否是新创建的session,是的话返回True,不是的话返回False】
判断是否是新用户的执行过程:
1.当用户第一次发出请求,tomcat会自动创建request,检查request中有没有系统cookie,没有的话就创建session。我们都知道用户第一次发请求的时候,request中并无sessionID。
2.所以此时服务端会创建一个session对象,并分配一个sessionID,serssion对象会保存在服务器端。此时session的状态处于new state状态,如果调用session.isNew(),则返回true
3.当服务器端处理完毕后,将此sessionID,同response一同传回到客户段,并将其存入到cookie中。
4.当客户段再次发送请求时,会将sessionID 同request一起发送,传递给服务器端。
5.服务器端可以根据传递过来的sessionID将这次请求(request)与保存在服务器端的session对象联系起来,此时的session已不处于new state状态,如果调用session.isNew(),则返回false.
6.循环3-5 ,直到session超时或销毁。
三、自提交页面
自提交页面:就是说你写一个jsp文件,文件中有跳转到本页面的代码。你最后的结果就是在本页面输出,类似于递归(循环)的思想,就是一直在调用这个页面。
四、MVC
1.MVC:model(模型层)、version(视图层)、controller(控制层)
- model(模型层):用于处理用户提交请求
- version(视图层):为用户提供使用界面,进行交互
- controller(控制层):对用户的请求进行处理,并根据model的计算结果向用户提供相应的响应
-
2.MVC的运行机制
(1)用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等 (2)服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理 (3)Model 处理后,将处理结果再交给 Controller (4)Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应 View 页面。页面经渲染(数据填充)后,再发送给客户端。
3.采用MVC模式写代码出现空指针异常
<1>现象:
有一种写法喜欢把视图层与控制层代码写在一起,把模型层分离。它的维护困难,健壮性差,而且会出现空指针异常问题。我们一般不建议这么做
<2>原因:
因为请求中没有传参,视图层是静态代码,服务器不会执行,所以对象值为null。所以会出现空指针异常的问题
<3>解决办法:
- 加一个补丁,判断是否是null
- 将视图层与控制层代码分离