会话:用户打开一个浏览器,点了很多超链接,访问多个web,关闭浏览器,这个过程可以称之为会话。
有状态会话:客户端访问服务端,下次再访问服务端,服务端就会知道该用户曾经来过。
怎么证明一个网站曾经来过?
1.当客户端访问服务端时,服务端给客户一个cookie,客户端下次访问服务端带上cookie就行了。
2.服务器登记你来过滤。下次你来的时候我来匹配你。(session)
保存会话的两种技术
Cookie
客户端技术
1.从请求中获取Cookie
2.服务器响应给客户端Cookie
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
resp.setCharacterEncoding("utf-8");
//获取请求中的 cookies
Cookie[] cookies = req.getCookies();
//获取响应的打印流
PrintWriter writer = resp.getWriter();
//如果Cookie不为空
if(cookies.length!=0){
for(int i=1;i<cookies.length;i++){
//查询Cookie的key
if(cookies[i].getName().equals("name")){
//获取Cookie的value
String value = cookies[i].getValue();
writer.write("the last time of logging is:"+new Date(Long.parseLong(value)));
break;
}
if(i==cookies.length-1){
//不存在该Cookie
writer.write("you never have logged in this web");
}
}
}
//设置新的cookie
Cookie cookie = new Cookie("name", String.valueOf(System.currentTimeMillis()));
//设置过期时间
cookie.setMaxAge(60*60*24);
//响应给客户端Cookie
resp.addCookie(cookie);
}
cookie:一般保存在本地的 用户目录下appdata目录;
删除Cookie方法:1.不设置有效期,关闭浏览器,自动失效。2,设置有效期时间为0。
Session
服务器技术
什么是Session:1.服务器会给每一个用户(浏览器)创建一个Session对象。2.一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。3.用户登录之后,整个网站他都可以访问!
设置Session
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//获取Session
HttpSession session = req.getSession();
//获取SessionId
String id = session.getId();
//给Session设置属性值
session.setAttribute("username","shenyc");
//判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("new Session id is "+id);
}else {
resp.getWriter().write("Session has been cereated, id is "+id);
}
//浏览器打开,Session创建时做了哪些操作
//Cookie cookie=new Cookie("JSESSIONID",id);
//resp.addCookie(cookie);
}
取Session的值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
String username = (String) session.getAttribute("username");
System.out.println(username);
}
跨Servlet之前用的是ServletContext,现在使用Session
ServletContext(ApplicationContext)中的数据是共享的,Seessioo中存放的数据是私有的。
Session失效方法
1.在xml文件中设置
<!-- 在Web.xml中设置Session默认的失效时间-->
<session-config>
<!-- 15分钟后Session自动失效-->
<session-timeout>16</session-timeout>
</session-config>
2.使用session的invalidate()方法注销。
Cookie和Session区别
Cookie是把用户的数据写到用户的浏览器请求中,浏览器保存。
Session把用户的数据写到用户独占的Session,而Session在服务端保存,根据独有的SessionId获取其中的数据。
Session对象由服务器创建,我们把在整个网站经常会使用的数据,将他保存在Session中。