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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章