6Cookie和Session
Cookie&Session
1会话简介
- 会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
- 有状态的会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话
- 保存会话的两种技术:cookie(客户端技术,响应,请求);session(服务器技术)
2Cookie
2.1简单流程
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
Cookie[] cookies=req.getCookies();//获得Cookie
cookie.getName();//获得cookie中的key
cookie.getValue();//获得cookie中的value
new Cookie("lastLoginTime",System.currentTimeMills()+"");//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
- 一般会保存在本地的 用户目录下 appdata
2.2细节问题
- 一个Cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- Cookie大小有限制4kb
- 300个cookie浏览器上限
2.3删除Cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期为0
2.4完整例子
public class Cookie7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
resp.setHeader("Content-type", "text/html;charset=UTF-8");
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//cookie服务器端从客户端获取
Cookie[] cookies = req.getCookies();//这里返回数字 说明cookie存在多个
//判断cookie是否存在
if (cookies!=null){
//如果存在怎么办
out.write("你上一次访问的时间是:");
for (int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("lastLoginTime")){
//获取cookie的值
String value = cookie.getValue();
long lastLoginTime = Long.parseLong(value);
//处理时间
Date date = new Date(lastLoginTime);
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
String format = sdf.format(date);
out.write(format);
}
}
}else {
out.write("这是你第一次访问");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//给cookie设置有效期 这样浏览器关掉还有用
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
3Session
3.1什么是session
- 服务器会给每一个用户(浏览器)创建一个session对象
- 一个session独占一个浏览器,主要浏览器没有关闭,这个session就存在
- 用户登录后,整个网站它都可以访问——>保存用户的信息,保存购物车的信息

3.2Session和cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户 独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建
3.3Session使用场景
- 保存一个登入用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据,我们将它保存在Session中
3.4具体使用
public class Session8 extends HttpServlet {
//给Session中存用户信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setHeader("Content-type", "text/html;charset=UTF-8");
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
//得到session
HttpSession session = req.getSession();
//给session中存东西
session.setAttribute("name","范翱");
//获取session的id
String id=session.getId();
//判断session是不是新建的
if (session.isNew()){
resp.getWriter().write("session创建成功,id为: "+id);
}else
resp.getWriter().write("session已经存在了,id为: "+id);
//session在创建的时候做了啥
//Cookie cookie = new Cookie("SESSIONID", id);
//resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//获取session中存储的用户信息
public class Session9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
resp.setHeader("Content-type", "text/html;charset=UTF-8");
resp.setCharacterEncoding("utf-8");
req.setCharacterEncoding("utf-8");
//得到session
HttpSession session = req.getSession();
String name = (String) session.getAttribute("name");
System.out.println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
//手动注销session
public class Session10 extends HelloServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
//手段注销session
session.removeAttribute("name");
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>servlet8</servlet-name>
<servlet-class>com.fao.servlet.Session8</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet8</servlet-name>
<url-pattern>/s8</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet9</servlet-name>
<servlet-class>com.fao.servlet.Session9</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet9</servlet-name>
<url-pattern>/s9</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>servlet10</servlet-name>
<servlet-class>com.fao.servlet.Session10</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet10</servlet-name>
<url-pattern>/s10</url-pattern>
</servlet-mapping>
<!-- 设置session默认的失效时间-->
<session-config>
<!-- 15分钟后session自动失效 以分钟为单位 -->
<session-timeout>15</session-timeout>
</session-config>

浙公网安备 33010602011771号