我们发现如果游览器访问服务器,如果没有携带JSESSIONID,那么服务器就会创建一个session,并且把这个session的JSESSIONID返回给游览器。
下面,我们再次访问同样的地址,这次就会携带JSESSIONID了。
我们发送的请求头
我们抓包看见的响应头
我们发现,如果游览器携带了JSESSIONID,那么游览器在访问时就会携带。而服务器在使用session时,就会使用这个JSESSIONID的session。
当然,上面是正常情况,那就是服务器端有对应JSESSIONID的session,并且没有过期。下面,我把游览器发送请求的JSESSIONID改2个字母,看游览器请求和服务器返回的是上面。
请求头
响应头
这次,我们发现请求头和响应头都携带了JSESSIONID,这是因为游览器携带的JSESSIONID在服务器端并没有对应的session,或者session已经过期了。所以服务器创建了一个新的session,并且把新的JSESSIONID返回给了游览器。
通过session底层实现机制和http抓包查看JSESSIONID,大家应该已经对session的原理有了清晰的认识。下面我来介绍一下session的常用方法(基于java的)。
session常用方法
-
resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
-
setAttribute(String s, Object o):在session存放属性
-
getAttribute(String s):从session中得到s所对应的属性
-
removeAttribute(String s):从session中删除s对应的属性
-
getId():得到session所对应的id
-
invalidate():使session立即无效
-
setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。
session实例应用
我们利用session来实现一个登录验证的功能。如果用户登录成功了,那么我们在1天内访问主页面就不需要登录了。我们利用session进行实现。
我创建了一个html页面,2个servlet来实现这次功能。代码如下
html页面
用户名:
密 码:
这个html就是一个简单的登录页面。
这个Servlet用于判断用户名和密码是否是我们规定的
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(606024);
//将用户名存入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(“
点击重新登录
”);}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
这个Servlet就是我们的主页面
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 {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
小编精心为大家准备了一手资料
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
BATJ面试要点及Java架构师进阶资料
]
[外链图片转存中…(img-sn3cJQwP-1711954733263)]
以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术
【附】架构书籍
- BAT面试的20道高频数据库问题解析
- Java面试宝典
- Netty实战
- 算法
[外链图片转存中…(img-UMMQdqtU-1711954733263)]
BATJ面试要点及Java架构师进阶资料
[外链图片转存中…(img-26FuyQ29-1711954733264)]