ubuntu18.04的網路配置
Cookie和Session
Cookie
Cookie是伺服器通知客戶端儲存鍵值對的一種技術,客戶端有了Cookie後,每次請求都發送給伺服器,每個Cookie的大小不能超過4kb
其中cookie的值不可以包含空格、方括號、圓括號、等號、逗號,雙引號,斜槓,問號,冒號、分號和中文。
如果想要支援上述的內容,要使用BASE64編碼
Cookie的建立
過程
- 建立cookie物件
- 通知客戶端儲存cookie
可以一次建立多個cookie
程式碼實現
protected void createCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 建立cookie物件 Cookie cookie = new Cookie("key1","value1"); //2. 通知客戶端儲存cookie resp.addCookie(cookie); resp.getWriter().write("Cookie建立成功"); }
伺服器獲取cookie
程式碼實現
- 遍歷獲取到的全部cookie
protected void getCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { //getName():返回cookie的key //getValue():返回cookie的value值 resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>"); } }
- 獲取指定key值的cookie
protected void createCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 建立cookie物件 Cookie cookie = new Cookie("key1","value1"); //2. 通知客戶端儲存cookie resp.addCookie(cookie); resp.getWriter().write("Cookie建立成功"); } protected void getCookie (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie[] cookies = req.getCookies(); Cookie iWantCookie = null; for (Cookie cookie : cookies) { //getName():返回cookie的key //getValue():返回cookie的value值 resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>"); if("key1".equals(cookie.getName())){ iWantCookie = cookie; break; } } //如果不等於null,說明找到了需要的cookie if(iWantCookie != null){ resp.getWriter().write("找到了需要的cookie"); } }
CookieUtils工具類
遍歷查詢經常使用,所以可以寫成一個工具類
public class CookieUtils {
/**
* 查詢指定名稱的Cookie物件
* @param name
* @param cookies
* @return
*/
public static Cookie findCookie(String name, Cookie[] cookies) {
if (name == null || cookies == null || cookies.length == 0) {
return null;
}
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}
Cookie值的修改
方法
- 方案一
- 先建立一個要修改的同名(指的就是key)的Cookie物件
- 在構造器,同時賦於新的Cookie值。
- 呼叫response.addCookie(Cookie);
- 方案二
- 先查詢到需要修改的Cookie物件
- 呼叫setValue()方法賦於新的Cookie值。
- 呼叫response.addCookie()通知客戶端儲存修改
程式碼實現
-
方案一
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //方案一 //1. 先建立一個要修改的同名(指的就是key)的Cookie物件 //2. 在構造器,同時賦於新的Cookie值 Cookie cookie = new Cookie("key1", "newValue1"); //3. 呼叫response.addCookie(Cookie); 通知客戶端儲存修改 resp.addCookie(cookie); resp.getWriter().write("key1的Cookie已經修改好"); }
-
方案二
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //方案二 //1、先查詢到需要修改的Cookie 物件 Cookie cookie = CookieUtils.findCookie("key1", req.getCookies()); if(cookie != null){ //2、呼叫setValue()方法賦於新的Cookie 值。 cookie.setValue("newValue"); } //3、呼叫response.addCookie()通知客戶端儲存修改 resp.addCookie(cookie); resp.getWriter().write("key1的值已經被修改"); }
Cookie的生命控制
管理Cookie什麼時候被銷燬(刪除),由SetMaxAge()方法決定
SetMaxAge():設定cookie的最大生存時間,以秒為單位
- 正數:表示在指定的秒數後過期
- 負數:表示瀏覽器一關閉,Cookie就會被刪除(預設值是-1)
- 零:表示馬上刪除Cookie
程式碼實現
-
setMaxAge(-1)
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("defaultLife", "defaultLife"); cookie.setMaxAge(-1);//設定存活時間 resp.addCookie(cookie); }
-
setMaxAge(0)
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //先找到要刪除的cookie物件 Cookie cookie = CookieUtils.findCookie("key1", req.getCookies()); if(cookie != null){ //呼叫setMaxAge(0) cookie.setMaxAge(0);//表示馬上刪除,不需要等待瀏覽器關閉 //呼叫response.addCookie(cookie) resp.addCookie(cookie); } resp.getWriter().write("key1的cookie已經被刪除"); }
-
setMaxAge()
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie cookie = new Cookie("life3600", "life3600"); cookie.setMaxAge(60 * 60);//設定cookie一小時後被刪除(無效) resp.addCookie(cookie); resp.getWriter().write("已經建立了一個存活一小時的cookie"); }
Cookie的有效路徑Path
Cookie的path屬性可以有效的過濾哪些Cookie可以傳送給伺服器,哪些不發。
path屬性是通過請求的地址來進行有效的過濾。
舉例
CookieA path=/工程路徑
CookieB path=/工程路徑/abc
請求地址如下:
http://ip:port/工程路徑/a.html
- CookieA 傳送
- CookieB 不傳送
http://ip:port/工程路徑/abc/a.html
- CookieA 傳送
- CookieB 傳送
Cookie的應用:免使用者名稱登入
程式碼實現
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登入</title>
</head>
<body>
<form action="http://localhost:8080/Cookie_Session/loginServlet" method="get">
使用者名稱:<input type="text" name="username" value="${cookie.username.value}"/><br/>
密碼:<input type="password" name="password" id=""/><br/>
<input type="submit" value="登入"/>
</form>
</body>
</html>
loginServlet.java
public class loginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if("nanjianwanzi".equals(username) && "123456".equals(password)){
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24 * 7);//cookie一週內有效
resp.addCookie(cookie);
System.out.println("登入成功");
}else{
System.out.println("登入失敗");
}
}
}
執行結果
Session
- Session是一個介面(HttpSession)。
- Session就是會話。它是用來維護一個客戶端和伺服器之間關聯的一種技術。
- 每個客戶端都有自己的一個Session會話。
- Session會話中,經常用來儲存使用者登入之後的資訊。
建立Session和獲取
-
request.getSession()方法
- 第一次呼叫是建立Session會話
- 之後呼叫都是獲取前面建立好的Session會話物件
-
isNew():判斷到底是不是剛創建出來的(新的)
- true 表示剛建立
- false 表示獲取之前建立
-
getId()得到Session的會話id值
每個會話都有一個身份證號。也就是ID值,而且這個ID是唯一的
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//建立和獲取session會話物件
HttpSession session = req.getSession();
//判斷當前session會話是否是新建立的
boolean sessionNew = session.isNew();
//獲取session會話的唯一標識
String id = session.getId();
resp.getWriter().write("得到的session,id是" + id + "<br/>");
resp.getWriter().write("得到的session,是否是新建立的:" + sessionNew);
}
Session域資料的存取
/**
* 在Session中儲存資料
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("儲存資料成功");
}
/**
* 獲取Session域中的資料
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("從Session中獲取key1的資料:" + attribute);
}
Session的生命週期控制
使用的方法
- setMaxInactiveInterval(int interval):設定Session的超時時間(以秒為單位),超過指定的時長,Session就會被銷燬
- 值為正數的時候,設定session的超時時長
- 值為負數的時候,表示永不超時(極少使用)
- getMaxInactiveInterval():獲取Session的超時時間
session的預設超時時長
Session的預設超時時長:1800秒
因為在Tomcat伺服器的配置檔案web.xml中預設有以下的配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
它就表示配置了當前Tomcat伺服器下所有的session超時配置預設時長為30分鐘(可以修改,但是很少修改)
若希望修改session的預設時長,可以在自己的web.xml配置檔案中做以上相同的配置,就可以修改web工程所有session的預設超時時長
如果想修改個別的session的超時時長,可以用setMaxInactiveInterval方法單獨設定超時時長
修改超時時長
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取session物件
HttpSession session = req.getSession();
//設定當前的session3秒後超時
session.setMaxInactiveInterval(3);
resp.getWriter().write("當前session設定為3秒後超時");
}
session馬上超時(馬上銷燬)
invalidate():讓當前session會話馬上超時無效
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取session物件
HttpSession session = req.getSession();
//設定當前的session3秒後超時
session.invalidate();
resp.getWriter().write("當前session設定為馬上超時");
}