Session工作模式(数据存储在服务器端)


一、Session工作模式

(1)Session是什么

服务器在内存中(服务器端)为不同的客户端创建了用于保存数据的Session对象。并将用于标识该对象的唯一SessionId发回给与该对象对应的客户端。
当浏览器再次发送请求时,SessionId也会被发送过去。服务器凭借这个唯一的SessionId找到与之对应的Session对象。
在服务器维护的这些用于保存于不同客户端交互时的数据的对象叫做Session。

(2)Session工作原理

在这里插入图片描述
当浏览器第一次访问服务器时,服务器会为该客户端分配一块对象空间。并使用不同的Sessionid形式,进行标识,该标识会随着响应发送到客户端并保存在客户端内存中。
当同一个客户端再次发送请求时,此标识也会被发送到服务器端,服务器判断要使用哪一个Session对象时,会根据客户端发来的Sessionid进行查找。

二、Session应用

(1)Session操作

获得Session

HttpSession s =request.getSession(boolean flag);//flaga为--> true:没有sid,创建session,false:没有,返回null
HttpSession s = request.getSession();//默认为true

使用session绑定对象

void session.setAttribute(String name,Object obj);

获取绑定数据或移除绑定数据

void session.getAttribute(String name);
void session.removeAttribute(String name);

删除session对象

void invalidate();

(2)使用session计数Demo

package session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 记录用户访问的次数
 * 
 * @author QianliangGuo
 */
public class countservlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset-utf-8");
		PrintWriter out = response.getWriter();
		// 获取session对象
		HttpSession session = request.getSession();
		// 输出sessionId
		System.out.println(session.getId());
		// 获取绑定的计数器
		Integer count = (Integer) session.getAttribute("count");
		if (count == null) {
			// 第一次访问
			count = 1;
		} else {
			// 不是第一次访问
			count++;
		}
		// 同步计数到session中
		session.setAttribute("count", count);
		//输出提示信息
		out.println("This is the "+count+" visit ");
		out.close();
	}
}

执行效果:

在这里插入图片描述
这说明,浏览器没有关闭时,Sessionid已经存在了,服务器端创建好了session并为其分配id,然后传给浏览器。当浏览器再次向服务器发送时,这个id就会再次被携带到服务器端。服务器端如果有这个id就会将其返回给浏览器,如果没有就新建一个sessionid再返回给浏览器。

(3)Session实现网页登录/退出Demo

有时候在一些视频网站,一些视频看着看着就会让重新登录。如果没有登录,下面的内容不让看,或者注册以后才能访问某一个网站。这是为了保护某些资源,在登录验证之后才能访问。

扫描二维码关注公众号,回复: 8499653 查看本文章

登录信息提交后,后台就开始验证,如果验证通过,就将用户信息保存在Session中,验证失败则返回登录页面,重新登录。

对于需要保护的资源,添加从session中获取绑定值的功能,来判断是否能够成功获取绑定的用户信息为判断依据,获取到则代表已验证,允许访问。获取不到绑定在session中的用户信息,则验证不通过,重定向到登录页面。

login.jsp(登录页面)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	Object msg = request.getAttribute("msg");
	if(msg!=null){
 %>
 <%=msg.toString() %>
 <%} %>
<html>
  <head>
  
  </head>
  
  <body>
   	<form action="login.do" method="post">
   		用户名:<input name="uname"/></br>
   		密码:<input name = "pwd" type="password"/> </br>
   		<input type="submit" value="登录"/>  	
   	</form>
   </body>
</html>

index.jsp(受保护的资源)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
	//小脚本:session验证
	Object uname = session.getAttribute("uname");
	if(uname == null){
		//重定向到login.jsp
		response.sendRedirect("login.jsp");
		return;
	}
 %>
 
<html>
  <head>
 
  </head>
  
  <body>
    <h1>欢迎登录:<%=uname.toString() %></h1>
    <a href="logout.do">退出</a>
  </body>
</html>

ActionSession.java(后台验证)

package session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ActionServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		// 设置编码
		request.setCharacterEncoding("utf-8");
		// 获得session
		HttpSession session = request.getSession();
		//设置session超时时间为10秒
//		session.setMaxInactiveInterval(10);
		// 获得请求路径
		String uri = request.getRequestURI();
		// 拆分路径,只保留login.do中的login
		String action = uri.substring(uri.lastIndexOf("/") + 1,uri.lastIndexOf("."));
		// 判断请求路径是否为登录
		if (action.equals("login")) {
			String uname = request.getParameter("uname");
			String pwd = request.getParameter("pwd");
			if (uname.equals("123") && pwd.equals("123")) {
				// 将登录的用户绑定到session
				session.setAttribute("uname", uname);
				// 重定向到index.jsp
//				response.sendRedirect("index.jsp");
				//如果禁用了Cookie,使用URL重写
				response.sendRedirect(response.encodeRedirectURL("index.jsp"));
				
			} else {
				// 登录失败,就转发到login.jsp
				request.setAttribute("msg", "用户名或密码有误");
				request.getRequestDispatcher("login.jsp").forward(request,response);
			}
		}else if(action.equals("logout")){
			//使session失效
			session.invalidate();
			response.sendRedirect("login.jsp");
		}
	}
}

效果演示:

在这里插入图片描述
登录失败,重定向回登录页面:
在这里插入图片描述
输入与后台匹配的账号密码:
在这里插入图片描述
登录成功:
在这里插入图片描述
点击退出:
在这里插入图片描述

三、URL重写

Session依赖Cookie,因为SessionId保存在客户端是以Cookie的形式保存的。浏览器金永刚Cookie,Session对象将不能使用,但可以通过URL重写,完成SID的保存。

什么是URL重写

浏览器在访问服务器的某个地址时,会使用一个改写过的地址,即在原有地址后追缴SessionID,这种重新定义URL内容的方式叫做URL重写。

在上面的Session实现网页登录/退出Demo中已经使用了URL重写,语句如下:

response.sendRedirect(response.encodeRedirectURL("xxx.jsp"));

四、Session生命周期

Session对象存在于内存中时会有默认的时间限制,超过缺省时间,session就会失效且不能继续访问。
Web服务器缺省的超时时间设置一般是30分钟。

修改Session的缺省时间限制

编程式针对该方法的session对象

在上面的Session实现网页登录/退出Demo已经设置了超时时间,语句如下:

session.setMaxInactiveInterval(int seconds);

声明式设置所有session对象
在tomcat的conf目录下,寻找web.xml文件修改为30分钟。

<session-config>
	<session-timeout>30</session-timeout>
</session-config>

五、session优缺点

优点:
1.安全(将状态保存在服务器端)
2.Session能够保存的数据类型更丰富,Cookie只能保存字符串。
3.Session能保存更多的数据,Cookie大约保存4K。

缺点:
1.Session将状态保存在服务器端,占用服务器的内存,如果用户量过大,会严重影响服务器的性能。

发布了328 篇原创文章 · 获赞 798 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/103639920
今日推荐