Session 及其使用示例
Session 及其使用示例
说明:下面介绍 ,我们使用到了浏览器抓包,HTTP 的知识,如果不了解,请先简单了解下 HTTP 介绍,HTTP 请求,HTTP 响应。因为 和 是一对“好兄弟”session用法 java,我们介绍 也要使用到 ,如果不清楚 ,请查看 详解。
什么是
在网络应用中称为“会话控制”session用法 java,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,就是一个对象Session 及其使用示例,用于存储信息。
有什么用
我们先来想一个问题,这个问题就是我们在游览购物网站时,我们并没有登录,但是我们任然可以将商品加入购物车,并且进行查看,当我们退出浏览器后再打开浏览器进行查看时,购物车中依然有我们选择的商品,这该怎么实现呢?
当然,我们可以使用 ,但是 不能存放大量数据,这时,我们就需要一种新的技术,。 是存储于服务器端的特殊对象,服务器会为每一个浏览器(客户端)创建一个唯一的 。这个 是服务器端共享,每个浏览器(客户端)独享的。我们可以在 存储数据,实现数据共享。

这是 的简单原理示意图

类似于一个 Map,里面可以存放多个键值对session用法 java,是以 key-value 进行存放的。key 必须是一个字符串,value 是一个对象。
底层实现机制
是每一个浏览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,在 HTTP 请求中往往会携带一个 ,这个 的名字是 ,这个 表示的就是 的 id,这个是由服务器创建的,并且是唯一的。服务器在使用 时,会根据 来进行不同操作,如下图所示:

当我们在服务端使用 时,首先要获取 ,这个 是通过 进行获取。当然,这时就已经有好多种情况了。例如浏览器访问时没有携带 ,浏览器携带的 对应的 不存在(或者失效)等情况。上面这个图就对服务器获取 的一些情况进行了说明。
浏览器抓包进行查看
下面我创建了一个简单的服务器,服务端操作 ,看浏览器中的 是如何进行携带的。我服务器的访问地址是 :8080/cs/, 最开始浏览器是没有 的 ,而服务端要操作 ,我们访问后看服务器返回什么。
这是我们抓包后看到的请求头

这是我们的响应头


我们发现如果浏览器访问服务器,如果没有携带 ,那么服务器就会创建一个 ,并且把这个 的 返回给浏览器。
下面,我们再次访问同样的地址,这次就会携带 了。
我们发送的请求头

我们抓包看见的响应头

我们发现,如果浏览器携带了 ,那么浏览器在访问时就会携带。而服务器在使用 时,就会使用这个 的 。
当然,上面是正常情况,那就是服务器端有对应 的 ,并且没有过期。下面,我把浏览器发送请求的 改 2 个字母,看浏览器请求和服务器返回的是什么。
请求头

响应头

这次,我们发现请求头和响应头都携带了 ,这是因为浏览器携带的 在服务器端并没有对应的 ,或者 已经过期了。所以服务器创建了一个新的 ,并且把新的 返回给了浏览器。
通过 底层实现机制和 HTTP 抓包查看Session 及其使用示例,大家应该已经对 的原理有了清晰的认识。下面我来介绍一下 的常用方法(基于 Java)。
常用方法 实例应用
我们利用 来实现一个登录验证的功能。如果用户登录成功了,那么我们在 1 天内访问主页面就不需要登录了。我们利用 进行实现。
我创建了一个 html 页面,2 个 来实现这次功能。代码如下:
html 页面
login
用户名:
密 码:

这个 html 就是一个简单的登录页面。
这个 用于判断用户名和密码是否是我们规定的
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/checkLogin")
public class CheckServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断用户名和密码是否为我们设置的密码
if (username.equals("tom") && password.equals("tom123")){
//得到 Session
HttpSession Session = request.getSession();
//设置最长访问间隔时间
Session.setMaxInactiveInterval(60*60*24);
//将用户名存入 Session
Session.setAttribute("username",username);
//重定向到主页面
response.sendRedirect(request.getContextPath()+"/mainPage");
}else {
//设置 MIME 类型和编码
response.setContentType("text/html;charset=utf-8");
//写回提示信息
PrintWriter writer = response.getWriter();
writer.write("账号或密码错误
");
writer.write("01点击重新登录
");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
这个 就是我们的主页面
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/mainPage")
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的 MIME 类型和编码
response.setContentType("text/html;charset=utf-8");
//得到 Session
HttpSession Session = request.getSession();
//取出用户名
Object username = Session.getAttribute("username");
PrintWriter writer = response.getWriter();
//判断用户名是否存在
if (username != null){
//在一天内登录过,无需再次登录
writer.write("用户:"+username+" 登录成功
");
}else {
//没有登录,或者登录间隔大于 1 天。重定向到登陆界面
response.sendRedirect(request.getContextPath()+"/login.html");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
代码测试
我们一来就直接访问主界面。

发现服务器发现我们没有登录,直接重定向到登录界面。下面我们来登录一下,输入我们设置的用户名和密码,分别是 tom 和

我们登录成功了,那么现在我们关闭浏览器,然后重新打开,并且直接访问主界面,看能否直接访问。

我们发现登录成功了,并没有重定向,因为我们已经登录过了嘛,一天之内都不需要重新登陆。我们的功能就实现了。
和 的比较总结
就是一个存储于服务器的特殊对象,通过 可以实现数据共享, 有一个 ,这个是 的唯一标识,使用它可以查找到 。 是会话级别的,对于每一个客户端来说是独享它所拥有的 的,我们使用 在进行页面跳转时,服务端可以利用 进行数据共享。 由服务器进行控制。 的创建和销毁都是服务器进行管理的。服务器会为每一个客户端创建一个 。
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » Session 及其使用示例
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码

