文章目录
概述
会话技术-Cookie
cookie的实现原理
在浏览器第一次发送请求的时候,携带一个参数,这个参数到达服务器,在服务器响应过程中以set-cookie响应头的形式传输到浏览器中并且保存在浏览器中(cookie信息)。发送第二次请求时,请求会自动携带cookie请求头,请求头中数据就是之前存储在浏览器中cookie信息。
Cookie特点:擅长于存储较长时间的数据,安全性较差。
代码实现【利用cookie实现返回上一次访问页面的时间】
//利用cookie实现返回上一次访问页面的时间
@WebServlet("/servlet/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//乱码
request.setCharacterEncoding("utf8");
response.setContentType("text/html;charset=utf8");
//生成时间
String time = new Date().toLocaleString();
//设置响应头(set-cookie)
response.setHeader("set-cookie","time="+time);
//cookie信息在cookie请求头中,需要request对象来获取
String cookie = request.getHeader("cookie");
//因为第一次没有cookie
if(cookie==null){
response.getWriter().write("您是初始访问页面!!!");
}else {
response.getWriter().write("上次访问时间:"+cookie);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Cookie类
Cookie类是由sun公司提供一个Cookie技术开发类,通过创建Cookie类的对象,可以设置Cookie对象身上的有效路径、最大生命时长等等。
代码一【通过Cookie类实现访问上一次页面的时间】
@WebServlet("/servlet/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//乱码问题
request.setCharacterEncoding("utf8");
response.setContentType("text/html;charset=utf8");
//提供时间
String time = new Date().toLocaleString();
//创建Cookie对象,指定Cookie对象的名称和值
Cookie cookie=new Cookie("time",time);
//设置Cookie对象的最大生命时长(单位秒)
cookie.setMaxAge(60*60*24);
//指定Cookie对象有些路径(一般指定到当前web应用)
cookie.setPath(request.getContextPath()+"/");
//发送Cookie
response.addCookie(cookie);
//通过请求对象获取Cookie对象
//浏览器端所有的Cookie对象都存在这个数组里
Cookie[] cookies = request.getCookies();
//第一次请求没有Cookie
if(cookies!=null){
//遍历数组---所有的Cookie对象
for(Cookie c:cookies){
//根据Cookie对象名称来查找指定的Cookie对象
if("time".equals(c.getName())){
response.getWriter().write("上次访问时间:"+c.getValue());
}
}
}else {
response.getWriter().write("第一次访问");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
代码二【删除cookie】
@WebServlet("/servlet/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建Cookie对象
Cookie cookie=new Cookie("time","");
cookie.setMaxAge(0);//生命时长为0
cookie.setPath(request.getContextPath()+"/");
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
会话技术-session
session的实现原理
由于浏览器端存储数据不安全,所以考虑把数据存储在服务器端就可以提升数据的安全性—session
在浏览器访问服务器之后,如果有session对象创建的语句执行则会在服务器中创建session对象,这个session对象存储当前浏览器的信息,多个浏览器会各自在服务器中保存对应的session对象,多个session对象是JSESSIONID来进行区分的。session是一个基于Cookie工作的对象,本质就是一个Cookie。在浏览器端会保留一个名词为JSESSIONID的
Cookie,用于存储session对象的ID。
注意:
request只能在服务器端操作
response只能在浏览器端操作
session对象的创建
session的特点:擅长于服务器端存储数据,时间较短,安全性较高
session功能一 域对象
@WebServlet("/servlet/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取session对象---域对象
HttpSession session = request.getSession();
//设置域属性
session.setAttribute("name","马云");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/servlet/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取session对象---域对象
HttpSession session = request.getSession();
//获取域属性的值
Object name = session.getAttribute("name");
System.out.println(name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
生命周期
一个会话指的是:浏览器从打开到关闭
购物车案例
/*购物车*/
@WebServlet("/servlet/BuyServlet")
public class BuyServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//乱码问题
request.setCharacterEncoding("utf8");
response.setContentType("text/html;charset=utf8");
//获取参数--商品信息
String prod = request.getParameter("prod");
//创建session对象
HttpSession session = request.getSession();
//把JSSSIONID存储在Cookie对象指定最大生命时长
Cookie cookie=new Cookie("JSESSIONID",session.getId());//指定session对象的ID
cookie.setPath(request.getContextPath()+"/");
cookie.setMaxAge(60*60*24*30);//即使关闭浏览器也有JSESSIONID的值
response.addCookie(cookie);
//设置域属性--商品信息
session.setAttribute("prod",prod);
//响应信息
response.getWriter().write("恭喜,商品【"+prod+"】已经添加到购物车");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/servlet/PayServlet")
public class PayServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//乱码问题
request.setCharacterEncoding("utf8");
response.setContentType("text/html;charset=utf8");
//创建session对象
HttpSession session = request.getSession();
//获取域属性--商品信息(如果没有添加商品到购物车域属性值就是null值)
Object prod = session.getAttribute("prod");
//
if(prod!=null){
response.getWriter().write("已为商品【"+prod+"】付款1000");
}else {
response.getWriter().write("您尚未选择任何商品");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}