6、Cookie和Seesion

1、现有问题

  • httpt是无状态的,不能保存每次提交的信息

  • 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。

  • 对于那些需要多次提交数据才能完成的web操作,比如登录,就成问题了

2、概念

将多次交互涉及的数据(即状态)保存下来。

3、状态管理

  • 客户端状态管理技术:cookie

  • 服务端状态管理技术:session

4、Cookie

几个重要的方法

  • 创建cookie,一般都是从服务器到客户端进行设置cookie,同时可以设置cookie针对的服务路径

    //创建一个cookie对象,并给该cookie赋名赋值
    Cookie cookie = new Cookie("username","Lin");
    //设置要服务的controller对象
    cookie.setPath("/getcookie");
    
    //设置cookie的存活时间,单位秒
     cookie.setMaxAge(60);
    //通过respone添加cookie,
    //在发送请求,响应后会传送cookie值,即该controller会有cookie,指定路径的controller也会有
    response.addCookie(cookie);
  • 获取cookie,被指定的路径中能获取被添加的cookie 

(获取cookie前先进行null判断,避免空指针异常)

//通过request获取cookie
Cookie[] cookies = request.getCookies();
//获取cookie名
cookie.getName()
//获取cookie值
cookie.getValue()
  • 总体实例
@RequestMapping("/setcookie")
    public String setCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie cookie = new Cookie("username","Lin");
        cookie.setPath("/getcookie");
        cookie.setMaxAge(60);
        response.addCookie(cookie);
        return "set cookie";
    }

    @RequestMapping("/getcookie")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                System.out.println("获取到的cookie值是:"+cookie.getName()+" = "+cookie.getValue());
            }
        }
        return "get cookie";
    }

注意:汉字的编码和解码就不解释了,用得比较少。注意另外一个点是如果另一个controller也进行创建cookie,并且服务路径对象及名字一样,会对先前的cookie覆盖掉。

5、Session

同一个会话能公用一个session

  • 原理

    服务器会为每次会话分配一个session对象

    同一个浏览器发起的多次请求,都属于一次会话(session)

    首次使用session时,服务器会自动创建session,并创建cookie存储sessionID发送回客户端

    关闭浏览器会失效

  • 几个重要方法

//创建session
request.getSession().setAttribute("name","Lin");
//获取session
String name = (String) request.getSession().getAttribute("name");
//消灭session
request.getSession().removeAttribute("name");
  • 实例
@RequestMapping("/setsession")
public String setSsion(HttpServletRequest request,HttpServletResponse response){

    request.getSession().setAttribute("name","Lin");
    return "setSesion";
}

@RequestMapping("/getsession")
public String getssion(HttpServletRequest request,HttpServletResponse response){

    String name = (String) request.getSession().getAttribute("name");
    System.out.println("session:"+name);

    request.getSession().removeAttribute("name");
    return "getsesion";
}
  • session的生命周期

    开始:第一次使用seesion的请求产生,则创建seesion

    结束:

    浏览器关闭,则关闭

    session超时,则失效:request.getSession().setMaxInactiveInterval(10); 单位秒

    手工销毁,则失效:request.getSession().invalidate();

  • 还有一个问题是浏览器关闭cookie后的处理,只做了解

  • request只对一次请求、session对一次会话、servletcontext对整个应用全局

 

posted @ 2022-07-12 16:18  jason饼干大怪兽  阅读(32)  评论(0)    收藏  举报