Servlet会话技术

会话技术

会话可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,那这整个过程我们称之为一个会话

作用

会话技术可以保存用户在会话过程中所产生的数据
会话技术也可以让用户在同一个会话中实现数据的共享

会话技术的分类:

1.cookie

  • cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上
  • 当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。

2.session

Servlet会话技术_第1张图片

  • session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象
  • 由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
  • session对象也是一个域对象,范围是整个会话
  • WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象)
  • 如果需要保存用户的数据,我们的程序可以把用户的数据保存在用户浏览器独享的session对象中
  • 如果用户再次的使用浏览器来访问其他的WEB资源,其他的WEB资源也可以通过session对象来获取这个用户的数据,以便为这个用户再次的服务
  • session对象由WEB服务器创建,我们可以通过请求对象的方法getSession()来获取。

session的有效期:

  默认30分钟内有效但是可以在web.xml中配置有效期
 
    
        1
    

Cookie的常用方法

  • 构造方法
    Cookie(String name,String value);

  • 获取名称
    String getName();

  • 获取值
    String getValue();

  • 设置有效时间(过期时间)
    void setMaxAge(int expiry)

  • 设置路径
    void setPath(String uri)

Session的常用方法:

  • 获取ID
    String getId()
  • 是否为新的session
    bollean isNew()
  • 存入键值对
    Session.setAttribute()
  • 获取键值对
    Session.getAttribute()
  • 移除Session中的键值对
    Session.removeAttribute()

cookie和session的区别

cookie:
是一种客户端技术,有大小和数量的限制,把数据保存在客户端,所以相对的不安全
session:
是一种服务器端技术,没有大小和数量的限制,把数据保存在服务器端,所以相对的安全

新建cookie会话

@WebServlet(name = "CookieServlet",urlPatterns = "/CookieServlet")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.创建Cookie
        Cookie cookie = new Cookie("uname", "admin");
        Cookie cookie1 = new Cookie("passwd", "123");
        //2.将Cookie对象添加到response
        response.addCookie(cookie);
        response.addCookie(cookie1);
        //3.向浏览器打印cookie creat success
        response.getWriter().println("cookie creat success");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在浏览器观察cookie否被写入
Servlet会话技术_第2张图片
cookie解决中文乱码问题:

//添加cookie时
Cookie cookie2 = new Cookie(URLEncoder.encode("年龄","utf-8"), "14");
//提取cookie时
URLDecoder.decode(cookie.getName(),"utf-8")+"\t"+cookie.getValue();

在servlet中获取cookie键值对:

@WebServlet(name = "TestCookieSevlet",urlPatterns = "/TestCookieSevlet")
public class TestCookieSevlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie:cookies){//便利cookies集合
            response.getWriter().println(URLDecoder.decode(cookie.getName(),"utf-8")+"\t"+cookie.getValue());//解决中文乱码
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

**

新建session

**

@WebServlet(name = "SessionServlet",urlPatterns = "/SessionServlet")
public class SessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session = request.getSession();
        //获取session的id
        String id = session.getId();
        response.getWriter().println("id:"+id);
        //判断session是否为新的session
        boolean aNew = session.isNew();
        response.getWriter().println("isnew:"+aNew);
        //向session中存入键值对 
        session.setAttribute("age",12);
        //获取session中的age
        Integer age = (Integer) session.getAttribute("age");
        response.getWriter().println("age"+age);
        //移除session中的age
        session.removeAttribute("age");
        age=(Integer) session.getAttribute("age");
        response.getWriter().println(age);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

每一个浏览器访问服务器的session的id不同,同一个浏览器第二次访问session.istrue变为false
测试结果:

Servlet会话技术_第3张图片

你可能感兴趣的:(Servlet会话技术)