1.会话技术
为了实现某一功能,浏览器和服务器之间可能会发生多次的请求和响应,从浏览器访问服务器开始,到最后访问服务器结束为止,期间产生的所有的请求和响应加在一起,称之为一次会话。
2.Cookie
2.1.cookie概述:
cookie是将会话中产生的数据存储在客户端。
过程描述:
浏览器向服务器发送请求,请求中包含需要保存的数据,服务器获取数据,通过set-cookie响应头将数据响应给浏览器,让浏览器自己保存。浏览器再次访问服务器时,在请求中,通过cookie请求头携带保存的数据,服务器可以通过获取cookie请求头获取数据,通过这种形式保存了会话中产生的数据。
2.2.实现Cookie
sun公司提供了一套Cookie的API
Cookie cookie = new Cookie(String name,String value);
//获取cookie的名字
cookie.getName();
//获取cookie的value值
cookie.getValue();
将cookie添加到response中进行响应,发给浏览器
response.addCookie(cookie)
从请求中获取cookie
//返回的是多个cookie组成的数组
Cookies[] cookies = request.getCookies();
注意:如果请求中没有cookie,返回值为null
2.3设置cookie存活时间
cookie默认是会话级别的,即保存在浏览器的内存中,如果浏览器关闭,随着浏览器内存的释放,cookie 也随之丢失
设置cookie存活时间:
//该方法可以设置cookie的存活时间,单位为秒
setMaxAge(int sec);
//单位是秒 60*60*24*30是一个月,下面设置的就是1个小时
cookie.setMaxAge(60*60);
一旦设置了这个方法,cookie就会存储在浏览器对应的磁盘上
2.4设置cookie路径
//设置cookie的路径,通常设置为当前web应用的路径
setPath(String path);
该路径就是提交cookie时指定的路径,即当访问这个路径及子路径时会携带cookie请求头
2.5删除cookie
没有删除cookie的API,如果想删除cookie,可以向浏览器发送一个同名、同path的cookie,并设置存活时间为0,这样就可以删除cookie,因为同名同path的cookie覆盖了之前的cookie,而由于生存时间为0,会马上删除
2.6cookie中 maxAge设置为负值 和0的区别
setmaxage(-1) :设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效;如果设置为0,则立即删除该Cookie。
3.代码示例
说明:代码中中英文混杂是为了测试设置的编码格式是否生效。
CookieServlet类实现了将时间加入cookie(即记录访问的时间),设置cookie的存活时间,设置cookie的路径,遍历数组获取上次的访问时间等
@WebServlet(name = "CookieServlet",urlPatterns = "/cookiedemo1")
public class CookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码 防止中文乱码
response.setContentType("text/html;charset=utf-8");
//显示上次的访问时间
//1.记录本次访问时间
//获取当前时间 过时的时间,且中间有空格 tomcat8不能正常运行
//String date = new Date().toLocaleString();
/日期测试-start
//方式一
Date date1 = new Date();
//重新设置时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date_time = df.format(date1);
System.out.println("SimpleDateFormat时间:"+date_time);
//方式二 此处只是说明 日期的另外一种设置方式,没有其他什么用处
String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
System.out.println("format:"+format);
///日期测试-end
//将时间加入cookie
Cookie cookie = new Cookie("time",date_time);
//设置cookie的存活时间
//单位是秒 60*60*24*30是一个月,下面设置的就是1个小时
cookie.setMaxAge(60*60);
//设置cookie的路径
cookie.setPath(request.getContextPath()+"/");
//将cookie添加到response中
response.addCookie(cookie);
//2.获取上次的访问时间
//获取请求头中的cookie
Cookie[] cookies = request.getCookies();
boolean flag = true;
//遍历数组
if (cookies!=null){
for (Cookie c: cookies
) {
//获取cookie的名字
String name = c.getName();
if ("time".equals(name)){
//如果找到名字为time的cookie,则将时间响应给浏览器
response.getWriter().write("最后访问时间(last time):"+c.getValue());
flag = false;
}
}
}
//没有找到名字为time的cookie,说明是第一次访问,没有cookie
if (flag){
response.getWriter().write("first come!欢迎!");
}
}
}
运行结果如下,通过浏览器可以查询到设置的cookie
ServletCookieDemo2 类 实现了删除cookie的方法
@WebServlet(name = "ServletCookieDemo2",urlPatterns = "/cookiedemo2")
public class ServletCookieDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
response.setContentType("text/html;charset=utf-8");
//删除cookie
Cookie cookie =new Cookie("time","");
cookie.setPath(request.getContextPath()+"/");
cookie.setMaxAge(0);
response.addCookie(cookie);
response.getWriter().write("cookie已经delete");
}
}
运行后,通过浏览器,可以检查到,之前设置的cookie 已经被删除