javaweb课程.classten(session)

session是什么哟?能不能说点人话!听都听不懂

我:请看VCR。

先看这一篇:xxx彻底弄清楚session是什么?-CSDN博客

session相关知识?

我:请看VCR。

Session详解,学习 Session对象一篇文章就够了_session撖寡情-CSDN博客

一.session

1.Session的定义

【官方解释】:一次浏览器与服务器交互的会话

【我的理解】:咱们知道,浏览器一般使用http协议打开一个网页。而http协议是无状态的,就是说每次请求没有关联。那我如果想在两个网页同时登陆,通过使用cookie可以做到,但是cookie在客户端,不安全。所以这个时候我们需要用到sessionsession在服务端,相对来说更安全。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(控制层)

  1. model(模型层):用于处理用户提交请求
  2. version(视图层):为用户提供使用界面,进行交互
  3. controller(控制层):对用户的请求进行处理,并根据model的计算结果向用户提供相应的响应
  4. 2.MVC的运行机制

(1)用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等 (2)服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理 (3)Model 处理后,将处理结果再交给 Controller (4)Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应 View 页面。页面经渲染(数据填充)后,再发送给客户端。

3.采用MVC模式写代码出现空指针异常

<1>现象:

有一种写法喜欢把视图层与控制层代码写在一起,把模型层分离。它的维护困难,健壮性差,而且会出现空指针异常问题。我们一般不建议这么做

<2>原因:

因为请求中没有传参,视图层是静态代码,服务器不会执行,所以对象值为null。所以会出现空指针异常的问题

<3>解决办法:

  • 加一个补丁,判断是否是null
  •  将视图层与控制层代码分离
  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值