Web基础之Cookie对象与Session对象(二)


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 -->展示博客界面

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>

SLoginServlet --> 验证登录后台
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>

Session ShowBlogServlet --> 获取博客后台
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在客户端以及服务端的过期时间;
学无止境!共勉!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值