文章目录
一、Cookie
1.1 new Cookie(“key”,“value”)
- 设置的值中不能包含空格
1.2 cookie.setMaxAge(10)
- 默认值是-1,表示关闭浏览器,cookie的值就会清除
1.3 案例
package com.example.demo.Goods;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Controller
public class GoodsController {
@RequestMapping("/Login")
public String Login(@RequestParam("phone")String phone, @RequestParam("pass")String pass, HttpServletRequest request, HttpServletResponse response){
boolean flag = false;
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(phone)) {
System.out.println("有对应的cookie");
System.out.println("cookie的时效: " + cookie.getMaxAge());
System.out.println("cookie的Comment: " + cookie.getComment());
System.out.println("cookie的Domain: " + cookie.getDomain());
System.out.println("cookie的Name: " + cookie.getName());
System.out.println("cookie的Path: " + cookie.getPath());
System.out.println("cookie的Value: " + cookie.getValue());
System.out.println("cookie的Secure: " + cookie.getSecure());
System.out.println("cookie的Version: " + cookie.getVersion());
flag = true;
}
}
} if(flag == false){
LocalDateTime now = LocalDateTime.now();
System.out.println("创建cookie了");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss");
String format = LocalDateTime.now().format(dateTimeFormatter);
Cookie cookie = new Cookie(phone, pass + "创建的时间是:_" + format);
cookie.setMaxAge(10 * 60);
cookie.setPath("/");
response.addCookie(cookie);
System.out.println("------------------------------------------");
System.out.println("新建的cookie的时效: " + cookie.getMaxAge());
System.out.println("------------------------------------------");
}
return "Success";
}
}
1.4 cookie.setPath("/");
- path默认是产生cookie的路径,如果不设置则只默认产生cookie的路径下的文件才能访问到该cookie,而其他路径的文件则访问不到该cookie。
参考:cookie.setPath()的用法
1.5 cookie.setDomain()
- 用来设置跨域,比如说a.com只能访问到自己域下面的cookie,而不能访问b.com下的cookie。
跨域共享cookie的方法:设置cookie.setDomain(".jszx.com");
A机所在的域:home.langchao.com,A有应用cas
B机所在的域:jszx.com,B有应用webapp_b
1)在cas下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie。
2)这个参数必须以“.”开始。
3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/webapp_b则不可以获得cookie。
4)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享。
1.6 cookie的同名问题
- 同一个路径下的cookie,一样的名称的cookie,后面会覆盖前面的。
- 不同路径下的cookie,可以存在同名的cookie。
1.7 参考
二、Session
2.1 session简单案例
package com.example.demo.Goods;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.crypto.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Controller
public class GoodsController {
@RequestMapping("/Login")
public String Login(@RequestParam("phone")String phone, @RequestParam("pass")String pass, HttpServletRequest request, HttpServletResponse response){
HttpSession session;
if(request.getSession().getAttribute(phone) != null){
LocalDateTime a = LocalDateTime.now();
session = request.getSession();
System.out.println("用户的session信息是: " + session.getAttribute(phone));
System.out.println("session的ID是" + session.getId());
System.out.println("session的CreationTime是" + a.plusNanos(session.getCreationTime()));
System.out.println("session的LastAccessedTime是" + a.plusNanos(session.getLastAccessedTime()));
System.out.println("session的ServletContext是" + session.getServletContext());
System.out.println("session的MaxInactiveInterval是" + session.getMaxInactiveInterval()/60 + "分钟");
}else {
request.getSession().setAttribute(phone, pass);
}
return "Success";
}
}
结果:
第二次登陆:且未到session的过期时间
用户的session信息是: 122
session的ID是0BB6388BF0F1D41C7A69B7C3C954D3F4
session的CreationTime是2019-12-11T21:11:37.957215789
session的LastAccessedTime是2019-12-11T21:11:37.957257873
session的ServletContext是org.apache.catalina.core.ApplicationContextFacade@4c90d147
session的MaxInactiveInterval是30分钟
2.2 存储sessionId
- cookie
- 重写url,使用response.encodeURL()方法。
2.3 session路径问题
session没有任何的路径访问问题。
2.4 常用方法
-
isNew():是否是新的Session,一般在第一次访问的时候出现
-
getid():拿到session,获取ID
-
getCreationTime():当前session创建的时间
-
getLastAccessedTime():最近的一次访问这个session的时间。
-
getRrquestedSessionid: 跟随上个网页cookies或者URL传过来的session
-
isRequestedSessionIdFromCookie():是否通过Cookies传过来的
-
isRequestedSessionIdFromURL():是否通过重写URL传过来的
-
isRequestedSessionIdValid():是不是有效的sessionID
2.5 session键值类型
- 键是string类型
- 值是Object类型
2.6 设置session的有效期
session.setMaxInactiveInterval(600);
2.7 销毁session
removeAttribute()就是从session删除指定名称的绑定对象,也就是说调用此方法后再调用getAttribute(Stringname)时,不能获取指定名称的绑定对象,但是session还存在。invalidate就是销毁此session对象,session对象中绑定的那些对象值也都不存在了.
session.invalidate()是销毁跟用户关联session,例如有的用户强制关闭浏览器,而跟踪用户的信息的session还存在,可是用户已经离开了。虽然session 生命周期浏览默认时间30分,但是在30分钟内别的用户还可以访问到前一个用户的页面,需销毁用户的session。session.removeAttribute()移除session中的某项属性。
在用户登陆中,用户退出时执行的是 request.getSession().removeAttribute(“userSession”);
session被销毁了
// 注销用户,使session失效。
验证验证码时,获取到session中的验证码后,用的是removeAttribute
是清空当前session中指定的属性,下个request中的sessionID是不变的
也就是说,session还是原来的session
销毁session时,removeAttribute()和invalidate()有何区别?
2.8 设置session永不过期
session.setMaxInactiveInterval(-1);
2.9 session.setMaxInactiveInterval(0);
在tomcat6中调用
request.getSession().setMaxInactiveInterval(0);
这个session会立即过期。
而在tomcat8中,同样的调用,会导致这个session永不过期,这也跟Oracle在HttpSession文档中描述一致:
An interval value of zero or less indicates that the session should never timeout.