Java之Cookie与Session

Cookie、Session

Cookie:服务端生成Cookie发给客户端用于认证

Session:服务端进行进行登记,每人有不同的Session

session与cookie的区别

Cookie:当用户打开浏览器访问网站,服务器端会生成一个cookie发给客户端,客户端访问网站就会携带cookie

Session:客户端请求服务端,服务端会生成一个sessionid,每个用户唯一,用类似于发给客户端cookie的方式发给客户端这个sessionid,用sessionid来辨别这次请求是那个客户端发来的。而在服务器端保存的session会存入很多东西,也是根据sessionid来辨别这些session中的内容是哪个用户的。

  • cookie是将用户的数据写给用户的浏览器,用浏览器保存,可保存多个cookie
  • session是将用户的数据,写给用户的session,服务器端保存,不建议保存太多
  • session由服务器创建

一个web站点可以发多个cookie

常用方法

Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + ""); //新建一个cookie
resp.addCookie(cookie);	//响应给客户端cookie
Cookie[] cookies = req.getCookies(); //获得cookie数组
cookie.setMaxAge(24*60*60);	//设置cookie有效期
cookie.getName()	//获得cookie名字
cookie.getValue()	//获得cookie的值

服务端发送给客户端cookie

//服务端发给客户端cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
resp.addCookie(cookie);

服务端获取客户端带来的cookie

//服务器端从客户端获取cookie
Cookie[] cookies = req.getCookies();    //这里返回数组,可能存在多个cookie

设置cookie有效期,以秒为单位

cookie.setMaxAge(24*60*60);

例子:保存cookie上一次访问的时间

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter out = resp.getWriter();

        //服务器端从客户端获取cookie
        Cookie[] cookies = req.getCookies();    //这里返回数组,可能存在多个cookie

        //判断cookie是否为空
        if (cookies!=null){
            out.write("上一次访问的时间是:");

            for (int i = 0; i <cookies.length; i++) {
                //获取cookie
                Cookie cookie = cookies[i];
                //获取cookie中的名字
                if (cookie.getName().equals("lastLoginTime")){
                    //获取cookie中的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }

        }else {
            out.write("第一次访问");

        }

        //服务端发给客户端cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        resp.addCookie(cookie);

    }

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

删除cookie

不设置有效期,关闭浏览器自动失效

设置cookie有效期为0

创建一个cookie,名字必须和要删除的cookie名字一致

public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");

        //设置有效期为0
        lastLoginTime.setMaxAge(0);
        resp.addCookie(lastLoginTime);
    }

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

    }
}

URL编解码

URLEncoder.encode("str", "utf-8");			//str进行URL编码
URLDecoder.decode("str", "utf-8");			//str进行URL解码

session

session在浏览器一打开就存在了,会类似于发送给客户端cookie一样。但这只是SessionID的操作,Session还可以设置其他的属性。

之前Servlet文章有提过,Servlet之间本身是无法通信,例如分享数据的。但是可以通过ServletContext上下文实现,其实在Session中通过Attribute也可以实现Servlet之间的通信的。

Cookie cookie = new Cookie("JSESSIONID", sessionId);
resp.addCookie(cookie);

常用方法

方法 作用
req.getSession() 获得一个session
session.setAttribute("name", "Zh1z3ven") 设置属性,value部分可以是一个对象
session.getAttribute("name") 获取属性
session.removeAttribute("name"); 删除属性
session.invalidate(); 注销session
session.getId() 获取sessionid
session.isNew() 判断是否为新创建的session

例子:创建session,获取sessionid,设置session属性

public class SessionDemo01 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");

        //得到session
        HttpSession session = req.getSession();


        //设置session属性
        session.setAttribute("name", "Zh1z3ven");
        //获取sessionid
        String sessionId = session.getId();

        //判断是否为新创建的session
        boolean aNew = session.isNew();
        if (aNew){
            resp.getWriter().write("session创建成功,sessionID为:" + sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在, SessionID为:" + sessionId);
        }

    }

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

获取sessin属性,新建一个person类

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

修改前面demo中设置属性值的语句

session.setAttribute("name", new Person("Zh1z3ven", 18));

获取session属性中的person对象

public class SessionDemo02 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");

        //得到session
        HttpSession session = req.getSession();

        //获取Session信息
        Person name = (Person) session.getAttribute("name");
        System.out.println(name);
    }

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

    }
}

这里就实现了不同的Servlet之间数据共享。

注销Session

删除属性,注销session。但是注销了会马上生成一个新的session

HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();

也可以在web.xml设置session过期时间

<!--    设置session配置-->
    <session-config>
<!--        设置session过期时间,以分钟为单位-->
        <session-timeout>2</session-timeout>
    </session-config>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章