1 cookie
1.1 什么是cookie
- 就是一个键值对用来存储少量的数据的字符串。
- 存在于客户的电脑上,每个客户向服务发送请求都会发送这个 cookie
- 可以使用 js 和 jquery 设置和读取cookie
1.2 读取和设置cookie
1.2.1 前端
<script>
// 函数中的参数分别为 cookie 的名称、值以及过期天数
function setCookie(c_name,value,expiredays){
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}
setCookie('name','zzyn',1); // cookie过期时间为1天。
</script>
读取 cookie
// 函数中的参数为 要获取的cookie键的名称。
function getCookie(c_name){
if (document.cookie.length>0){
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1){
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1){
c_end=document.cookie.length;
}
return unescape(document.cookie.substring(c_start,c_end));
}
}
return "";
}
var uname= getCookie('name');
1.2.2 后端
如何创建cookie
浏览器给服务器发送请求时,如果浏览器中储存的有服务器发送的cookie值,就会将cookie值作为请求得一部分发送给服务器,没有就算了。而服务器方面,每次至少会有一个 cookie 被发送(就是session 会话的值),而在此基础上,后端程序员也可以修改cookie的值,或者添加新的 cookie 键值对。
之后服务器就会通过响应将 cookie 发送给浏览器,并被浏览器储存,至于时间由可以在服务器创建时,当然可以设置的不只时间,还有允许的路径。
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 创建 Cookie 对象
Cookie cookie = new Cookie("key4", "value4");
//2 通知客户端保存
Cookie resp.addCookie(cookie);
//1 创建 Cookie 对象
Cookie cookie1 = new Cookie("key5", "value5");
//2 通知客户端保存
Cookie resp.addCookie(cookie1);
resp.getWriter().write("Cookie 创建成功");
}
**注意:**这里createCookie
的方法并不是servlet接口自带的,而是通过在doGet
和doPost
方法中通过前后端约定好的 action参数,通过反射实现方法的调用。代码如下
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
这样调用方法,可以保证代码具有较高的可读性,虽然后面基本不会使用到这样的技巧
如何获得cookie
浏览器向客户端发送请求时就会向服务器发送 cookie,服务器也可以通过cookie值进行一些对应的操作。
为了保证代码的可重用,可以单独将判断的过程写到工具类当中。
public class CookieUtils {
/**
* 查找指定名称的 Cookie 对象
* @param name
* @param cookies
* @return
*/
public static Cookie findCookie(String name , Cookie[] cookies)
{
if (name == null || cookies == null || cookies.length == 0) {
return null;
}
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}
Servlet实现代码:
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// getName 方法返回 Cookie 的 key(名)
// getValue 方法返回 Cookie 的 value 值
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
}
Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
//判断是否为空,并调用,上面写的方法
if (iWantCookie != null) {
resp.getWriter().write("找到了需要的 Cookie");
}
}
如何修改cookie
方法一:创建新的 cookie 替代旧的 cookie
// 1、先创建一个要修改的同名的 Cookie 对象
// 2、在构造器,同时赋于新的 Cookie 值。
Cookie cookie = new Cookie("key1","newValue1");
// 3、调用 response.addCookie( Cookie ); 通知 客户端 保存修改
resp.addCookie(cookie);
方法二:直接修改原来的 cookie 并响应个原来的方法。
// 1、先查找到需要修改的 Cookie 对象
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
if (cookie != null) {
// 2、调用 setValue()方法赋于新的 Cookie 值。
cookie.setValue("newValue2");
// 3、调用 response.addCookie()通知客户端保存修改
resp.addCookie(cookie);
}
如何查看浏览器中的 cookie
按下 F12
就可弹出,一下窗口,这是edge,不同的浏览器会有不同的工作区会有不同的名字,具体情况具体分析。
如何设置cookie的生命周期
cookie的生命周期是真正的时间
可以使用 setMaxAge(long time);
以秒为单位。
- 如果time是正数表示,则默认为指定关闭的秒数。
- 如果是负数,表示关闭浏览器自动清理 cookie,默认为 -1
- 0 马上删除cookie
/**
* 设置存活 1 个小时的 Cooie
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("life3600", "life3600");
// 设置 Cookie 一小时之后被删除。无效
cookie.setMaxAge(60 * 60);
resp.addCookie(cookie);
resp.getWriter().write("已经创建了一个存活一小时的 Cookie");
}
设置 cookie 的有效路径
这样设置的目的是为了,保证,cookie 只有在特定路径下才可以被浏览器使用,以防止出现不必要的麻烦。起过滤作用
CookieA path=/工程路径
CookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送
路径默认为是项目的工程路径
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("path1", "path1");
// getContextPath() ===>>>> 得到工程路径
cookie.setPath( req.getContextPath() + "/abc" );
// ===>>>> /工程路径/abc
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有 Path 路径的 Cookie");
}
2 Session 会话
2.1 概念
- 代码表现是 Session 就是一个接口
- Session 用来维护客户端和服务器之间的一种关联
- 每个客户端都有一个会话,存储在服务器中。
- 常用来保存用户登录之后的信息。
2.2 创建和获取Session
创建和获取写在一起,是因为这两个使用同一个方法。
Session request.getSession()
第一次调用:创建Session
之后就是获取
boolean session.isNew()
判断是否是新创建出来的。
true 是刚创建
false 不是刚创建
- 向Session中设置数据
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置 Session 中的数据为 key1-value1
HttpSession session = req.getSession().setAttribute("key1", "value1");
//查看默认超时时长
int time = session.getMaxInactiveInterval();
//设置超时时长
session.setMaxInactiveInterval(3);//以秒为单位,此为3秒
//让session 马上超时
//session.inValidate();
//获得 session 中存储的数据
session.getAttribute("key1");
resp.getWriter().write("已经往Session中保存了数据");
}
除了以上获得的数据还有一个就是 Session 的id,每一个Session 都有一个独一无二的 ID ,而通过cookie行浏览器呈递的就是这个cookie。
tomcat 默认session的超时时长为 30 秒。如果想修改,可以在 tomcat 服务器下的 web.xml 文件中配置。
<session-config>
<session-timeout>20</session-timeout>
</session-config>