- _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信息.