Web基础之Cookie对象与Session对象(二)
一、知识回顾:
HTTP协议是无状态连接的协议;即每次请求都是独立的;
为了保持会话记录,出现了Cookie和Session技术;
Cookie技术是客户端会话保持技术;
Session技术是服务端会话保持技术;
Cookie的主要原理是通过设置响应头Set-Cookie,把Cookie的值写到客户端,以后客户端的每次请求都会带上这个Cookie,服务器这边可以先获取所有请求头中的Cookie,根据Cookie判断是来自哪个客户端的请求;
上篇博客主要是分享了Cookie技术的使用,包括Cookie的创建,发送,获取,Cookie的路径设置,Cookie的有效期等,然后通过一个实例来理解Cookie技术;
二、Session技术详解
2、1:Session原理
2、2:请求报文分析:
第一次请求头没中cookie信息,响应头中返回给客户端JSESSIONID,后面多次请求中,每次都带了JSESSIONID给服务端。
2、3:Session的生效和失效:
session什么时候生效?
第一次访问
session什么时候失效?由于无状态连接,对于客户端而言,退出浏览器,cookie中的sessionId失效,会话结束;
但是对于服务端而言,不能感知到该变化,在超过session的最大存活时间,而没有客户端访问,
则session在服
务端失效。
三、Session的获取、存值、取值
写例子,实现一下上面的三个小功能:
怎么拿到session?
怎么保存到session?
服务端怎么从session中拿东西?
sessionlogin.jsp --> 登录界面
SLoginServlet --> 验证登录后台
welcome.jsp --> 欢迎界面
SessionShowBlogServlet --> 获取博客后台
sessionshowblog.jsp -->展示博客界面
怎么拿到session?
怎么保存到session?
服务端怎么从session中拿东西?
sessionlogin.jsp --> 登录界面
SLoginServlet --> 验证登录后台
welcome.jsp --> 欢迎界面
SessionShowBlogServlet --> 获取博客后台
sessionshowblog.jsp -->展示博客界面
sessionlogin.jsp --> 登录界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
<form action="/MyCookieAndSession/sessionlogin" method="POST">
用户名:<input type="text" name="userName"><br/>
密 码:<input type="password" name="passWord"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
package com.usc.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SLoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取参数
String userName =req.getParameter("userName");
String passWord =req.getParameter("passWord");
if("BlueSky".equals(userName) && "123".equals(passWord)){
HttpSession session=req.getSession();
session.setAttribute("yesuser", userName);
req.getRequestDispatcher("/welcome.jsp").forward(req, resp);
}else{
resp.sendRedirect("/error.jsp");
}
}
}
welcome.jsp --> 欢迎界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎界面</title>
</head>
<body>
欢迎您:<%=request.getSession().getAttribute("yesuser") %><br>
<a href="http://localhost:8080/MyCookieAndSession/sessionblog">进入我的博客</a>
</body>
</html>
package com.usc.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionShowBlogServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("UTF-8");
//获取请求头中的Cookie
List<String> blog = new ArrayList<String>();
Object obj=req.getSession().getAttribute("yesuser");
if(obj!=null){
blog.add("这里是"+obj+"的第一条博客记录;");
blog.add("这里是"+obj+"的第二条博客记录;");
blog.add("这里是"+obj+"的第三条博客记录;");
blog.add("这里是"+obj+"的第四条博客记录;");
}
req.setAttribute("blogs", blog);
req.getRequestDispatcher("/sessionshowBlog.jsp").forward(req, resp);
}
}
sessionshow blog.jsp -->展示博客界面
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>博客界面</title>
</head>
<body>
<%
List<String> blogs=(ArrayList)request.getAttribute("blogs");
for(int i=0;i<blogs.size();i++){
%>
<%=blogs.get(i)%><br>
<%
}
%>
</body>
</html>
四、运行效果:
登录界面:
欢迎界面:
博客展示界面:
再次直接访问博客展示界面:(如果没有Session会话保持技术,这里的四条博客记录将不再显示,有兴趣的可以自己试试)
五、总结
Session是服务端会话保持技术;因为数据保存在服务端;而Cookie是客户端会话保持技术,主要是会把Cookie的值通过响应头写给客户端,数据在客户端;
Sesson技术主要了解Session技术的简单原理,Session的获取、存值、存值以及Session在客户端以及服务端的过期时间;
学无止境!共勉!