Cookie、Session
Cookie:服務端生成Cookie發給客戶端用於認證
Session:服務端進行進行登記,每人有不同的Session
session與cookie的區別
Cookie:當用戶打開瀏覽器訪問網站,服務器端會生成一個cookie發給客戶端,客戶端訪問網站就會攜帶cookie
Session:客戶端請求服務端,服務端會生成一個sessionid,每個用戶唯一,用類似於發給客戶端cookie的方式發給客戶端這個sessionid,用sessionid來辨別這次請求是那個客戶端發來的。而在服務器端保存的session會存入很多東西,也是根據sessionid來辨別這些session中的內容是哪個用戶的。
- cookie是將用戶的數據寫給用戶的瀏覽器,用瀏覽器保存,可保存多個cookie
- session是將用戶的數據,寫給用戶的session,服務器端保存,不建議保存太多
- session由服務器創建
cookie
一個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>