会话
会话:指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程。
客户端和服务器的请求和响应的过程(对话双方只要有一方发生变化,都属于不同的会话)
超时间隔【距离上一次请求的间隔】,超时后就属于不同的会话
HTTP是无状态的,不保存用户信息
Cookie客户端
Session服务器
Cookie
Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中【保存在客户端的磁盘或缓存(内存)中】,从而使浏览器和服务器可以更好地进行数据交互。
用户第一次访问时,没有Cookie
Cookie API
Cookie的相关方法
Cookie–setMaxAge()和getMaxAge()
负数:浏览器一关,缓存就会清空【将Cookie保存在浏览器的缓存中】
默认为-1
Cookie的案例
/*** Illustration** @author dengqing* @time 2021/10/13* @function cookie上次访问时间*/@WebServlet(name = "Cookie1", value = "/cookie1")
public class Cookie1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html; charset=UTF-8");//字符输出流PrintWriter out = response.getWriter();Date date = new Date();//格式化输出SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");//获取当前时间String NowTime = sdf.format(date);//创建Cookie对象并保存当前时间到Cookie对象之中Cookie cookie = new Cookie("LastTime", NowTime);//将Cookie信息回写至客户端浏览器response.addCookie(cookie);//设置cookie保存在磁盘中,为90秒;90秒后失效cookie.setMaxAge(90);//把浏览器中所有Cookie返回//Cookie[] cookies:Cookie对象数组Cookie[] cookies = request.getCookies();String LastAccessTime = null;//如果cookies不为空,再循环,防止空指针异常if (cookies != null) {//增强型for循环for (Cookie c : cookies) {//匹配是否有"LastTime" Cookie//"LastTime"字符串写在前面,防止空指针异常if ("LastTime".equals(c.getName())) {//获取Cookie的值,如果为空,则为浏览器第一次访问LastAccessTime = c.getValue();}}}//Cookie的值,如果为空,则为浏览器第一次访问if (LastAccessTime.isEmpty()) {out.write("你是首次访问本站!");} else {//每次刷新,就会重新计算90秒:cookie.setMaxAge(90);//90秒后失效,就又会显示:你是首次访问本站!out.write("你上次访问本站的时间:" + LastAccessTime);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
Session会话
Cookie是键值对,不能存储大量数据【每次放在请求头中】,并且不安全,效率低
所以使用Session存储大量数据,Session是一种将会话数据保存到服务器端的技术
说会话,指Session
Session的创建,由Servlet容器在发起会话时自动创建
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性【32位16进制,16的32次方,2^128次方,ID不会重复,类似IPv6,64位】,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
Session原理
Session是通过Cookie技术实现的,依赖于名为JSESSIONID的Cookie,它将信息保存在服务器端。Session中能够存储复杂的Java对象,因此使用更加方便。如果客户端不支持Cookie,或者禁用了Cookie,仍然可以通过使用URL重写来使用Session。
Session-获取Session对象
不同的请求对象获取的Session对象,不一定不同;因为可能是处于同一次会话
同一个浏览器的不同窗口是同一个Session;不同的浏览器是不同Session
Session相关方法
大型项目一般使用时间戳,国内外一致【getLastAccessedTime()】
Sesssion超时,设置为分钟,在超时时间内如果没有任何请求则超时
invalidate():类似删除Session
Tomcat的Session超时设置
Session案例
浏览器不同窗口属于同一次会话
浏览器关闭,则结束会话了
loginServlet.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--等效-->
<!--action="http://localhost:8082/WebServletProject_war_exploded/loginServlet"-->
<form action="loginServlet"><!--div标签:把组件分割开--><!--placeholder 是HTML5 中新增的一个属性。placeholder可以用来描述输入字段预期值的简短的提示信息。提示信息会在用户输入值之前显示,一旦用户输入信息该提示就会自动消失。--><!--placeholder :提示用户输入信息--><div><input type="text" name="uname" placeholder="用户名"></div><input type="password" name="upwd" placeholder="密码"></br><div><input type="submit" value="登录"></div></form>
</body>
</html>
LoginServlet.java
/*** Illustration** @author dengqing* @time 2021/10/13* @function Session:实现登录成功后存入Session;获取Sesssion数据*///http://localhost:8082/WebServletProject_war_exploded/loginServlet.html
@WebServlet(name = "LoginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();System.out.println("进入loginServlet登录页面...");//获取login.html页面用户输入的值String name = request.getParameter("uname");String pwd = request.getParameter("upwd");if ("admin".equals(name) && "123".equals(pwd)) {//获取对话SessionHttpSession session = request.getSession();//将当前用户的名称存入Sessionsession.setAttribute("user",name);//<script>alert('登录成功')</script>:JavaScript,弹出警告框out.write("<script>alert('登录成功')</script>");response.sendRedirect("mainServlet");} else {out.write("用户名或密码输入错误");response.sendRedirect("loginServlet.html");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
MainServlet.java
@WebServlet(name = "MainServlet", value = "/mainServlet")
public class MainServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();//获取当前对话的Session对象HttpSession session = request.getSession();//获取Session的用户名称Object user = session.getAttribute("user");//不为空,之前已经登录过,直接访问if (user!=null){out.write("进入MainServelt主页面");out.write("欢迎回来!"+(String)user);}else {out.write("你还没有登录,请先登录后再访问此页面!\n");out.write("<a href='loginServlet.html'>点击此处进行登录!</a>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
Java Bean
JavaBean符合一定规范写的Java类,是一种规范。它的方法命名,构造以及行为必须符合特定的要求:
1.所有属性为private
2.这个类必须具有一个公共的(public)无参构造函数
3.private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范
4.这个类是可序列化的,要实现serializable接口
JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。