有状态会话:一个同学你来过教室,下次再来教室,我就知道了你这个同学,曾经来过,称之为有状态会话;
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程称之为会话;
有状态会话
一个网站怎么证明你来过?
客户端 服务端
cookie
session
常见场景:网站登录过之后,你下次访问就不用在登录了,直接就默认登录上去了;
cookie方法测试
编写java代码(测试cookie 记录用户访问客户端时间):
public class CookieTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求和响应的数据编码
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获取输出流对象
PrintWriter out = resp.getWriter();
// 获取当前会话的所有cookie
Cookie[] cookies = req.getCookies();
// 判断当前的cookies中是否有数据
if(cookies == null){
// 第一访问会话
// 创建一个cookie对象
Cookie cookie = new Cookie("firstTime", System.currentTimeMillis()+"");
resp.addCookie(cookie);
// 输出信息
out.println("<h1>第一次访问当前网页</h1>");
}else{
for (int i = 0; i < cookies.length; i++) {
// 获取一个cookie对象
Cookie cookie = cookies[i];
// 判断当前cookie对象的name是否为firstTime
if("firstTime".equals(cookie.getName())){
// 获取cookie的值
String value = cookie.getValue();
// 强转数据类型
long lastTime = Long.parseLong(value);
Date date = new Date(lastTime);
// 如果是就输出最后一次访问
out.println("<h1>你第一次访问当前界面时间:"+date.toLocaleString()+"</h1>");
}
// 判断当前cookie对象的name是否为lastTime
if("lastTime".equals(cookie.getName())){
// 获取cookie的值
String value = cookie.getValue();
// 强转数据类型
long lastTime = Long.parseLong(value);
Date date = new Date(lastTime);
// 如果是就输出最后一次访问
out.println("<h1>最后一次访问当前界面时间:"+date.toLocaleString()+"</h1>");
}
}
}
// 创建一个cookie对象
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");
// 将当前创建的cookie对象添加到resp中去
resp.addCookie(cookie);
}
}
编写映射配置文件
<servlet>
<servlet-name>cookieTest</servlet-name>
<servlet-class>com.huaijiuwang.servlet.CookieTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cookieTest</servlet-name>
<url-pattern>/cookieTest</url-pattern>
</servlet-mapping>
访问测试:
第一次访问网页输出
第二次访问输出
第三次访问输出
发现代码成功达到了我们的预期:
在cookie中存储了当前的数据
其他方法:配置当前cookie的失效时间
// 创建一个cookie对象
Cookie cookie = new Cookie("firstTime", System.currentTimeMillis()+"");
cookie.setMaxAge(60 * 60 * 24);
resp.addCookie(cookie);
在第一次添加cookie的时候设置失效时间
当前的cookie失效时间设置成功。
关闭浏览器,再次打开
默认就记录第一次访问的时间,
// 创建一个cookie对象
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis()+"");
cookie.setMaxAge(0);
手动修改cookie失效时间(当前就是一直都不会存在最后一次的访问时间了)
无论刷新多少次,都没有最后一次访问的数据了
如果cookie中存的是中文,那么最好做以下两步:
// 设置编码
URLEncoder.encode("怀旧", "utf-8");
// 解码
URLEncoder.decode(cookie.getValue(), "utf-8");
结论
session的使用
获取session
public class SessionTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 获取session
HttpSession session = req.getSession();
// 将输入存入session中
session.setAttribute("userName", "怀旧");
// 判断session是不是新创建的
if (session.isNew()) {
// 获取session的sessionId
resp.getWriter().println("新创session创建成功!sessionID为:" + session.getId());
}
}
}
注册映射
<servlet>
<servlet-name>session1</servlet-name>
<servlet-class>com.huaijiuwang.servlet.SessionTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session1</servlet-name>
<url-pattern>/s1</url-pattern>
在创建一个Servlet用来读取session数据
public class SessionTest1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 获取session
HttpSession session = req.getSession();
// 获取session中的数据
String username = (String)session.getAttribute("userName");
// 将得到数据输出到前端
resp.getWriter().println(username);
}
}
注册映射
<servlet>
<servlet-name>session2</servlet-name>
<servlet-class>com.huaijiuwang.servlet.SessionTest1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
运行测试:
访问/hj/s1
第一次访问,输出创建成功!
再次访问测试
输出内容为空
访问s2
成功取出数据
关闭浏览器再次打开:
session重新创建了
换一个浏览器在打开
也创建了一个单独的session并且session都不想相同
测试在session中存入自定义数据类型数据
public class Student {
private String userName;
private int age;
public Student(String userName, int age) {
this.userName = userName;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"userName='" + userName + '\'' +
", age=" + age +
'}';
}
}
修改代码
// 将输入存入session中
session.setAttribute("userName", new Student("怀旧", 18));
// 获取session中的数据
Student student = (Student)session.getAttribute("userName");
// 将得到数据输出到前端
resp.getWriter().println(student.toString());
重启运行测试
成功获取数据。
session的清除
创建一个清除session的Servlet
public class SessionTest2Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
// 获取session
HttpSession session = req.getSession();
// 手动注销session
session.invalidate();
}
}
编写映射文件
<servlet>
<servlet-name>session3</servlet-name>
<servlet-class>com.huaijiuwang.servlet.SessionTest2Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>session3</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
测试运行
运行注销后,session就变成一个新的session了
代表原始数据也会被注销,数据同样会被刷新
自动注销session
直接编写配置文件即可
<session-config>
<!-- 单位为分钟(这边就是1分钟后session失效) -->
<session-timeout>1</session-timeout>
</session-config>
运行测试:
等待1分钟后重新刷新,看看session会不会发生改变
发现1分钟后session成功刷新了。
评论
登录后才可以进行评论哦!