在之前的jsp列表获取中,我们都是一收到请求就去数据库里查询记录,然后写到页面。但如果是一个商城,我们一开始登录,输入账号和密码,浏览器将账号和密码POST发送到web服务器,loginServlet中判断后,将是否匹配成功和将账号密码一起放入域对象再转发到显式商品列表的show.jsp,show.jsp从域对象中获取是否匹配成功和信息和账号密码后,再带着账号和密码去请求showServlet,showServlet再从域对象中取出账号密码,经过判断后返回该用户有权限看到的数据到show.jsp,此时用户看到了他这个账号密码对应的数据了。可以看到这中间有多次取出域对象,存入域对象的操作,非常繁琐。
采用cookie客户端会话技术简化上述操作,用户第一次访问某个站点:协议+IP+端口时,如果账号密码匹配,servlet会生成一个cookie对象携带一些特殊方式加密过的信息放在响应头中响应给前端,浏览器帮助用户自动保存cookie,并且在用户下一次请求同一个协议+IP+端口时(比如在同一标签页中点购物车,或者再新开一个标签页点购物车),浏览器自动将cookie放在请求头中带到对应的servlet。但是浏览器是将它存储的所有站点的cookie都带到对应的servlet。
示例如下:第一次访问带着原有的cookie去服务器,服务器新建一个cookie返回。第二次访问,浏览器自动将第一次返回的cookie放在了请求头中带往服务器,服务器通过getCookies()获得所有cookie的数据,经过删选看到了第一次给出去的cookie。
TestAddCookie
package com.ldj; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/testAddCookie") public class TestAddCookie extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //发送cookie //1创建cookie独享,暂时未加密 Cookie cookie = new Cookie("username", "zs"); //2发送cookie resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
TestGetCookie
package com.ldj; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/testGetCookie") public class TestGetCookie extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取cookie,暂时未解密 Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { String name = cookie.getName(); if ("username".equals(name)) { String value = cookie.getValue(); System.out.println(name + "======" + value); } } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
默认cookie的保留时间是浏览器关闭就销毁,服务器响应cookie的时候可以设置cookie在浏览器上保留的时间,cookie.serMaxAge()
===========================================================
服务端会话技术session。
从上,我们可以看出,虽然账号密码在cookie中传递,是经过加密解密的,但在传递肯定就不安全,要尽量减少传递次数。所以采用session,只在第一次请求时,浏览器将账号密码带到服务器,服务器根据浏览器信息账号密码等生成一个session,这个session对应一个ID,这个session存在服务器中,ID放在响应头中以cookie的形式返回给浏览器保存。浏览器下一次发起HTTP请求时候,会带着这个ID访问服务器,服务器servlet会根据ID找出存在服务器上对应的session,就可以从session中获取出账号密码进行后续的判断等。
这个ID全名:JSESSIONID
服务器未关闭的时间内,session是存在内存中的,默认30分钟销毁session对象。
钝化活化:如用tomcat作为web服务器,服务器关闭后session会自动落盘,下次开启服务器会读取落盘的数据,并且将盘中数据全部删除,下次关闭再自动落盘。由于session生成时也根据浏览器的状态信息,所以浏览器重启的话,有可能服务端根据ID找到的session经过一些判断会被丢弃,需要重新生成session?
================================================
cookie和session
=======================================================================