1 Cookie
1.1 Cookie的基本使用
1 概念
客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据请求
2 工作流程
服务端Servlet可以将给response设置Cookie,这样浏览器接收到的数据中,就含有Cookie数据,下次请求时,会携带Coolie数据,以此来实现会话间的数据共享
3 使用方式
Cookie cookie = new Cookie("key", "value");
resp.addCookie(cookie);
浏览器中查看cookie
在另一个Servlet的doGet()方法中获取Cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie: cookies) {
String key = cookie.getName();
String value = cookie.getValue();
System.out.println("key = " + key + ", value = " + value);
}
输出结果
key = JSESSIONID, value = D4A69F356FAC98B600F16EBF4C7C99BF
key = key, value = value
key = Idea-dfc854f3, value = caf432a3-c8a7-4ccd-af20-abf25269830d
1.2 Cookie原理
cookie是Request和Response中的Header
Response
Request
1.3 Cookie时效
设置Cookie存活时间
cookie.setMaxAge(60 * 60 * 24 * 7);
再请求时可以看到有效时间
关闭浏览器再打开时,请求servelet还会携带此cookie
1.4 cookie携带中文
在cookie的value中设置中文参数
Cookie cookie = new Cookie("username", "汤姆");
请求后,报错
修复方式: 使用URLEncoder.encode()方法将中文encode
示例:
String username = URLEncoder.encode("汤姆", "UTF-8");
System.out.println("username = " + username);
Cookie cookie = new Cookie("username", username);
再次请求后,控制台输出
username = %E6%B1%A4%E5%A7%86
同时,Cookie解码端也要使用UrlDecode
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
2 Sesion
2.1 Session的使用
//获取session
HttpSession session = req.getSession();
//设置session key value
session.setAttribute(String key, String value);
//根据key取出session value
session.getAttribute(String key);
//移除session
session.removeAttribute(String key);
在SessionA的方法中设置username
HttpSession session = req.getSession();
session.setAttribute("username", "tom");
在SessionB的方法中获取username
HttpSession session = req.getSession();
String username = (String) session.getAttribute("username");
System.out.println("username = " + username);
先请求SessionA Servlet后再请求SessionB Servlet,控制台输出
username = tom
2.2 Session原理
1 Servlet中获取到的session是同一个对象
@WebServlet("/session_a")
public class SessionServletA extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
System.out.println("session = " + session);
session.setAttribute("username", "tom");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
@WebServlet("/session_b")
public class SessionServletB extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
System.out.println("session = " + session);
String username = (String) session.getAttribute("username");
System.out.println("username = " + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
先请求SessionA再请求SessionB后,控制台输出
session = org.apache.catalina.session.StandardSessionFacade@626caf88
session = org.apache.catalina.session.StandardSessionFacade@626caf88
可以看到两个Servlet中获取到的Session是同一个对象
实现原理是请求时,客户端携带的Sessionid相同
从这也能看出,Session是基于Cookie实现的
Session在本地保存的位置没有找到
2.3 Session钝化与活化
当服务器重启后,Session还是能够正常获取到。
1 首先访问servlet_a, 在ServletA中设置Session
2 关闭tomcat,重新启动
3 再访问servlet_b,是=可以获取到在ServletA中设置的Session
Session在服务器重启后,Session数据会被保存
2.4 Session销毁
Session默认有效时间默认为30min
保存在conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
也可以手动设置有效时间
手动在WEB-INF/web.xml中把有效时间改为1min
<session-config>
<session-timeout>1</session-timeout>
</session-config>
设置过期后,再通过session.getAttribute()获取session中保存的值将会获取不到
session = org.apache.catalina.session.StandardSessionFacade@4b0937cb
username = null
手动设置session过期
session.invalidate();
调用invalidate()方法后,再调用session.getAttribute()将会报错