一、会话

一、概念

在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程,比如从输入账户密码进入操作系统到退出操作系统就是一个会话过程。会话较多用于网络上,TCP的三次握手就创建了一个会话,TCP关闭连接就是关闭会话;

有状态会话:可以在不同的方法调用间保持针对各个客户端的状态与客户端的联系必须被维持,这样做开销要大一些

二、保存会话的两种方式

cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样web资源处理的就是各自的数据!

session:Session是服务器端技术,利用这个技术服务器在运行时可以为每一个用户的浏览器绘制创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去服务器中的其他web资源时,其它web资源再从用户各自的session中取出数据为用户服务

二、cookie

1.添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.saxon.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class cookieDemo extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding ("utf-8");
resp.setContentType ("text/html;charset=UTF-8");
resp.setCharacterEncoding ("utf-8");
Cookie[] cookies = req.getCookies ();
PrintWriter out = resp.getWriter ();
if (cookies!=null){
for (Cookie cookie : cookies) {
String name = cookie.getName ();
if (name.equals ("saxon")) {
String value = cookie.getValue ();
Date date = new Date (Long.parseLong (value));
out.print ("你上次来的时间是" + date);
}
}
}else {
out.write ("欢迎光临\n");
}
Cookie cookie = new Cookie ("saxon", System.currentTimeMillis () + "");
cookie.setMaxAge (24*60*60);//Set-Cookie: saxon=1595912818749; Max-Age=86400; Expires=Wed, 29-Jul-2020 05:06:58 GMT
resp.addCookie (cookie);//每次都给一个新的cookie,覆盖上一个同名cookie
System.out.println ("********************************");
}

@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet (req, resp);
}
}
2.删除
  • 不设置日期,直接关闭浏览器,就删除cookie
  • 设置cookie.setMaxAge=0;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.saxon.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DeleteCookie extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType ("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies ();
Cookie new_cookie=null;
for (Cookie cookie : cookies) {
if (cookie.getName ().equals ("saxon")){
new_cookie=cookie;
}
}
if (new_cookie!=null){
new_cookie.setMaxAge (0);
resp.getWriter ().print (cookie.getName ()+"删除成功");
}
resp.addCookie (new_cookie);
}

@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet (req, resp);
}
}

3.编码

1
2
3
String str="删除成功";
URLEncoder.encode (str,"GBK");//编码
URLDecoder.decode (str,"GBK");//解码

3.cookie的上限

三、session

一、概念

session:Session是服务器端技术,利用这个技术服务器在运行时可以为每一个用户的浏览器绘制创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去服务器中的其他web资源时,其它web资源再从用户各自的session中取出数据为用户服务

response.getWriter().print()和response.getWriter().writer()的区别:

  • response.getWriter().print(),不仅可以打印输出文本格式的(包括html标签),还可以将一个对象以默认的编码方式转换为二进制字节输出
  • response.getWriter().writer(),只能打印输出文本格式的(包括html标签),不可以打印对象

二、测试

1.获取session对象,添加节点信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.saxon.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding ("utf-8");
resp.setCharacterEncoding ("utf-8");
resp.setContentType ("text/html;charset=utf-8");
HttpSession session = req.getSession ();
session.setAttribute ("saxon","saxon");//可以保存一个对象

if (session.isNew ()){
resp.getWriter ().print ("新创建的session:"+session.getAttribute ("saxon")+"的ID是"+session.getId ());

}else {
resp.getWriter ().print ("原来就有的"+session.getAttribute ("saxon")+"的ID是"+session.getId ());

}
}

@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet (req, resp);
}
}

2.获得session的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.saxon.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionShow extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取指定的节点
HttpSession session = req.getSession ();
String saxon = (String) session.getAttribute ("saxon");
resp.getWriter ().print (saxon);
}

@Override
protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet (req, resp);
}
}

3.删除session
  • 在web.xm配置文件会话自动过期
1
2
3
<session-config>
<session-timeout>1</session-timeout> <!--单位是分钟-->
</session-config>
  • 利用session.invalidate ();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package com.saxon.servlet;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;

    public class SessionDelete extends HttpServlet {
    @Override
    protected void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession ();
    session.removeAttribute ("saxon");//移除保存的数据
    session.invalidate ();


    }

    @Override
    protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet (req, resp);
    }
    }

三、session与cookie的区别

  • cookie:**cookie是把数据写在用户自己的浏览器,交给用户自己保存,直接把信息交给用户**
  • session:**把用户的数据写在独立的session里面,交给服务器保管(保存重要信息,节约服务器资源),交给用户的是一个ID,用户不知道里面的内容,但是可以凭借这个访问服务器的资源资源在服务器**
  • session由服务器创建,不写也是存在

==使用频繁的信息我们用session保存:例如用户登录信息,购物信息==