1. 程式人生 > 實用技巧 >ubuntu18.04的網路配置

ubuntu18.04的網路配置

Cookie和Session

Cookie是伺服器通知客戶端儲存鍵值對的一種技術,客戶端有了Cookie後,每次請求都發送給伺服器,每個Cookie的大小不能超過4kb

其中cookie的值不可以包含空格、方括號、圓括號、等號、逗號,雙引號,斜槓,問號,冒號、分號和中文。

如果想要支援上述的內容,要使用BASE64編碼

Cookie的建立

過程

  1. 建立cookie物件
  2. 通知客戶端儲存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值的修改

方法

  • 方案一
    1. 先建立一個要修改的同名(指的就是key)的Cookie物件
    2. 在構造器,同時賦於新的Cookie值。
    3. 呼叫response.addCookie(Cookie);
  • 方案二
    1. 先查詢到需要修改的Cookie物件
    2. 呼叫setValue()方法賦於新的Cookie值。
    3. 呼叫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和獲取

  1. request.getSession()方法

    • 第一次呼叫是建立Session會話
    • 之後呼叫都是獲取前面建立好的Session會話物件
  2. isNew():判斷到底是不是剛創建出來的(新的)

    • true 表示剛建立
    • false 表示獲取之前建立
  3. 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設定為馬上超時");
}

瀏覽器和session之間的關聯