- _nosay
会话技术概述
2017-11-20 15:35:09
会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的.
会话分类
会话技术分为Cookie和Session:
2.Session:将数据存储到服务端,安全情相对好,增加服务器的压力.
Cookie简介
数据存储在客户端本地,减少服务端的存储压力,安全性不好,客户端可以清除cookie.
Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习
1.服务端怎样将一个Cookie发送到客户端
2.服务端怎样接受客户端携带的Cookie
Cookie的创建于发送
服务器端向客户端发送一个Cookie
1.创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue)
示例:
Cookie cookie = new Cookie("username","nosay")
那么该cookie会以响应头的形式发送给客户端
2.向客户端发送cookie
response.addCookie(Cookie cookie);
package net.zixue.cookie; 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(name = "CookieServlet",urlPatterns = "/cookie") public class CookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("username","nosay"); //值不能使用中文 response.addCookie(cookie); } }
访问相应链接,查看已经生成了名为username的cookie
上面我们发现,如果关闭浏览器在打开的话,发现创建的cookie已经被销毁了,如何让此cookie持久化呢?
1.设置Cookie在客户端的持久化时间 :
cookie.setMaxAge(int seconds):单位(秒)
注意:如果不设置持久化时间 ,cookie会存储在浏览器的内存中,浏览器关闭,cookie信息销毁(会话级别的cookie),如果设置持久化时间.cookie信息会被持久化到浏览器的磁盘文件中
示例:
cookie.setMaxAge(10*60)
设置cookie信息在浏览器的磁盘文件中存储的时间为10分钟,过期浏览器自动删除该cookie信息
2.设置Cookie的携带路径
cookie.setPath(String path);
注意,:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
示例:
cookie.setPath("/hello");
代表访问hello的应用中的任何资源都携带cookie
cookie.setPath("/hello/cookieServlet");
代表访问hello中的cookieServlet时才携带cookie信息
如果我们生成了一个很大的cookie,但是只希望它在特定的页面去使用,毕竟如果全局全部带着此cookie,会影响不少的性能,这样的话,我们该如何去做呢.
新建一个servlet,命名为GetCookieServlet,内容为:
package net.zixue.cookie; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "GetCookieServlet",urlPatterns = "/getCookie") public class GetCookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
修改CookieServlet文件,内容变更为:
package net.zixue.cookie; 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(name = "CookieServlet",urlPatterns = "/cookie") public class CookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("username","nosay"); //值不能使用中文 cookie.setMaxAge(60*10); cookie.setPath("/getCookie"); response.addCookie(cookie); } }
此时清除cookie先访问CookieServlet,后发现只有访问getCookie会携带相应的cookie,测试成功.
3.向客户端发送cookie:
response.addCookie(Cookie cookie);
4.删除客户端的cookie
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可.
也就是说只要把
cookie.setMaxAge(60*10);
设置为0即可.
服务端怎么接收客户端携带的Cookie
cookie信息是以请求头的方式发送到服务器端的:
1.通过request获得所有的Cookie:
Cookie[] cookies = request.getCookies();
2.遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
for(Cookie cookie:cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
相关代码如下
CookieServlet:
package net.zixue.cookie; 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(name = "CookieServlet",urlPatterns = "/cookie") public class CookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie cookie = new Cookie("username","nosay"); //值不能使用中文 cookie.setMaxAge(60*10); cookie.setPath("/getCookie"); Cookie cookie1 = new Cookie("age","18"); cookie1.setMaxAge(60*10); cookie1.setPath("/getCookie"); response.addCookie(cookie); response.addCookie(cookie1); } }
getCookieServlet
package net.zixue.cookie; 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(name = "GetCookieServlet",urlPatterns = "/getCookie") public class GetCookieServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { String name = cookie.getName(); if(name.equals("age")) { String cookieValue = cookie.getValue(); response.getWriter().write("age:" + cookieValue); } } } }
测试成功打印出我们想要的age信息.