第74節:Java中的Cookie和Session

来源:https://www.cnblogs.com/dashucoding/archive/2019/01/24/10312527.html
-Advertisement-
Play Games

第74節:第74節:Java中的Cookie和Session : 什麼是 ,有什麼用哦,怎麼用呢? 啟動伺服器後,會給每個應用程式創建一個 ,並且這個 對象只有一個。可以用於獲取全局參數,工程下的資源,和存取數據,共用數據。 例子,如何獲取全局參數,如何獲取工程下的資源,如何進行存取數據,用例子代碼 ...


標題圖

第74節:第74節:Java中的Cookie和Session

ServletContext:

什麼是ServletContext,有什麼用哦,怎麼用呢?

啟動伺服器後,會給每個應用程式創建一個ServletContext,並且這個ServletContext對象只有一個。可以用於獲取全局參數,工程下的資源,和存取數據,共用數據。

例子,如何獲取全局參數,如何獲取工程下的資源,如何進行存取數據,用例子代碼進行展示。

getServletContext().getInitParams();getServletConfig().getInitParams();

getServletContext().getRealPath()
getServletContext().getReasourceAsStream()

InputStream is = getClass().getClassLoader().getReasourceAsStream();

相對路徑和絕對路徑

getServletContext().setAttribute()

getServletContext().getAttribute()

獲取登錄成功次數

HttpServletRequest:

請求對象,用於封裝客戶端提交過來的數據或者信息。
可以獲取頭信息,提交過來的數據:
`request.getParameter("name"); // dashucoding url連接拼接

中文亂碼情況

HttpServletResponse:

響應對象,伺服器要返回給客戶端的數據

跳轉頁面:
response.setStatus(302);

response.setHeader("Location","success.html");

文件下載:輸出流和輸入流的對接

下載中文名字的資源:

效果

效果

// index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    預設servlet去下載<br>
    <a href="download/aa.jpg">aa.jpg</a><br>
    <a href="download/bb.txt">bb.txt</a><br>
    <a href="download/cc.rar">cc.rar</a><br>

    <br>手動下載<br>
    <a href="Demo01?filename=aa.jpg">aa.jpg</a><br>
    <a href="Demo01?filename=bb.txt">bb.txt</a><br>
    <a href="Demo01?filename=cc.rar">cc.rar</a><br>
    <a href="Demo01?filename=達叔.png">達叔.png</a><br>
</body>
</html>
// Demo01.java
package com.dashucoding.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Demo01
 */
public class Demo01 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 獲取要下載的文件名字
        String fileName = request.getParameter("filename");
        // 獲取這個文件在tomcat裡面的絕對路徑地址
        String path = getServletContext().getRealPath("download/"+fileName);
        
        // 用於用戶下載
        response.setHeader("Content-Disposition", "attachment; filename="+fileName);
        
        // 轉化成輸入流
        InputStream is = new FileInputStream(path);
        OutputStream os = response.getOutputStream();
        
        int len = 0;
        byte[] buffer = new byte[1024];
        while( (len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        
        os.close();
        is.close();
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

瀏覽器

// Demo01.java
package com.dashucoding.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Demo01
 */
public class Demo01 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // 獲取要下載的文件名字
        String fileName = request.getParameter("filename");
        
        // get請求有中文
        //byte[] bytes = fileName.getBytes("ISO-8859-1");
        //new String(bytes, "UTF-8");
        fileName = new String(fileName.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("fileName="+fileName);
        
        // 獲取這個文件在tomcat裡面的絕對路徑地址
        String path = getServletContext().getRealPath("download/"+fileName);
        
        // 對中文的名字進行編碼處理
        // 獲取來訪客戶端的類型
        String clientType = request.getHeader("User-Agent");
        
        if (clientType.contains("Firefox")) {
            fileName = DownLoadUtil.base64EncodeFileName(fileName);
        }else {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }
        
        // 用於用戶下載
        response.setHeader("Content-Disposition", "attachment; filename="+fileName);
        
        // 轉化成輸入流
        InputStream is = new FileInputStream(path);
        OutputStream os = response.getOutputStream();
        
        int len = 0;
        byte[] buffer = new byte[1024];
        while( (len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len);
        }
        
        os.close();
        is.close();
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
// DownLoadUtil
package com.dashucoding.servlet;

import java.io.UnsupportedEncodingException;

import sun.misc.BASE64Encoder;

public class DownLoadUtil {
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

效果

登錄

效果

// LoginServlet
package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // public void setContextType(String type)
        // 設置將發送到客戶端的響應的內容類型,如果該響應尚未提交,給定內容類型可能包含字元編碼規範,例如
        // text/html;charseet=UTF-8,如果在調用 getWriter之前調用此方法,則只根據給定內容類型設置響應的字元編碼
        
        response.setContentType("text/html;charset=utf-8");
        
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        
        if("admin".equals(userName) && "123".equals(password)) {
            response.getWriter().write("登錄成功");
        }else {
            response.getWriter().write("登錄失敗");
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
// web
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>RequestRedirctionDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>LoginServlet</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.dashucoding.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>
// login
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form action="login">
        賬號: <input type="text"  name="username"/><br>
        密碼: <input type="text"  name="password"/><br>
        <input type="submit"  value="登錄"/><br>
    </form>
</body>
</html>

效果

效果

效果

// LoginServlet
package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // public void setContextType(String type)
        // 設置將發送到客戶端的響應的內容類型,如果該響應尚未提交,給定內容類型可能包含字元編碼規範,例如
        // text/html;charseet=UTF-8,如果在調用 getWriter之前調用此方法,則只根據給定內容類型設置響應的字元編碼
        
        response.setContentType("text/html;charset=utf-8");
        
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        
        if("admin".equals(userName) && "123".equals(password)) {
            // response.getWriter().write("登錄成功");
            response.setStatus(302);
            response.setHeader("Location", "login_success.html");
        }else {
            response.getWriter().write("登錄失敗");
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

效果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登錄成功!!!</h1>
</body>
</html>

效果

重定向

package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // public void setContextType(String type)
        // 設置將發送到客戶端的響應的內容類型,如果該響應尚未提交,給定內容類型可能包含字元編碼規範,例如
        // text/html;charseet=UTF-8,如果在調用 getWriter之前調用此方法,則只根據給定內容類型設置響應的字元編碼
        
        response.setContentType("text/html;charset=utf-8");
        
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        
        if("admin".equals(userName) && "123".equals(password)) {
            // response.getWriter().write("登錄成功");
            /*response.setStatus(302);
            response.setHeader("Location", "login_success.html");*/
            
            // 重定向寫法,重新定位方向
            // response.sendRedirect("login_success.html");
            
            // 請求轉發的寫法
            request.getRequestDispatcher("login_success.html").forward(request, response);
            
        }else {
            response.getWriter().write("登錄失敗");
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

用於自動登錄,瀏覽記錄等,是伺服器給客戶端的.

Cookie cookie = new Cookie("a","b");
// 響應
response.addCookie(cookie);

獲取Cookie

package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Demo01
 */
public class Demo01 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //Cookie的簡單使用。
        
        //cookie 發送給客戶端,並且保存在客戶端上的一份小數據
        
        response.setContentType("text/html;charset=utf-8");
        
        //發送cookie給客戶端
        Cookie cookie = new Cookie("aa", "bb");
        //給響應,添加一個cookie
        response.addCookie(cookie);
        response.getWriter().write("請求成功了...");
        
        
        
        //獲取客戶端帶過來的cookie
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie c : cookies) {
                String cookieName = c.getName();
                String cookieValue = c.getValue();
                System.out.println(cookieName + " = "+ cookieValue);
            }
        }
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }


}

Cookie是一份小數據,是伺服器給客戶端,存儲在客戶端上的一份小數據.

http請求是無狀態的.

在響應的時候添加Cookie

Cookie cookie = new Cookie("name", "value");
// 添加cookie
response.addCookie(cookie);

在客戶端信息里,響應頭中多了Set-Cookie

獲取客戶端帶來的Cookie

Cookie[] cookies = request.getCookies();
if(cookies != null){
 for(Cookie c : cookies){
  String cookieName = c.getName();
  String cookieValue = c.getValue();
  System.out.println(cookieName + " = " + cookieValue);
 }
}

cookie過期

public int getMaxAge()
返回以秒為單位指定的cookie的最大生存時間.

public void setMaxAge(int expiry)
設置cookie的最大生存時間,以秒為單位.

如何顯示上次登錄時間

可以進行判斷賬號密碼,如果上次有登錄過,那麼顯示上次的登錄時間.這裡分兩種情況,獲取帶過來的cookie進行判斷,第一種是沒有cookie的,第一次登錄,輸出登錄成功或者失敗,然後給客戶端添加cookie,new Cookie(),第二種的登錄過的,還是要輸出登錄成功或者是失敗,獲取以前的cookie.時間戳要重置怎麼理解?

package com.dashucoding.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dashucoding.util.CookieUtil;

/**
 * Servlet implementation class Demo03
 */
public class Demo03 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        response.setContentType("text/html;charset=utf-8");
        
        String userName = request.getParameter("username");
        String password = request.getParameter("password");
        
        if("admin".equals(userName) && "123".equals(password)){
            //獲取cookie last-name --- >
            Cookie [] cookies = request.getCookies();
            
            //從數組裡面找出我們想要的cookie
            Cookie cookie = CookieUtil.findCookie(cookies, "last");
            
            //是第一次登錄,沒有cookie
            if(cookie == null){
                
                Cookie c = new Cookie("last", System.currentTimeMillis()+"");
                c.setMaxAge(60*60); //一個小時
                response.addCookie(c);
                
                response.getWriter().write("歡迎您, "+userName);
                
            }else{
                //1. 去以前的cookie第二次登錄,有cookie
                long lastVisitTime = Long.parseLong(cookie.getValue());
                
                //2. 輸出到界面,
                response.getWriter().write("歡迎您, "+userName +",上次來訪時間是:"+new Date(lastVisitTime));
                
                
                //3. 重置登錄的時間
                cookie.setValue(System.currentTimeMillis()+"");
                response.addCookie(cookie);
            }
        }else{
            response.getWriter().write("登陸失敗 ");
        }
    
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

如何顯示商品瀏覽記錄

獲取提交過來的id,把id放入到cookie里,跳轉界面.

servlet?id=1;
servlet?id=2;
獲取cookie 1
1#2
setValue("1#2");

jsp

效果

效果

// index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
 <br>---------1------------<br>
 <%! int a = 123; %>
 <br>---------2------------<br>
 <% int b = 123456; %>
 <br>---------3------------<br>
 <%=a %><br>
 <%=b %>
</body>
</html>

瀏覽記錄

package com.dashucoding.util;

import javax.servlet.http.Cookie;

public class CookieUtil {
    /**
     * 從一個cookie數組中找到具體我們想要的cookie對象
     * @param cookies
     * @param name
     * @return
     */
    public static Cookie findCookie(Cookie[] cookies , String name){
        if(cookies != null){
            for (Cookie cookie : cookies) {
                if(name.equals(cookie.getName())){
                    return cookie;
                }
            }
        }
        return null;
    }
}
                <!-- 顯示瀏覽記錄 -->
                <%
                Cookie[] cookies = request.getCookies();
                Cookie cookie = CookieUtil.findCookie(cookies, "history");
                 // 如果cookie是空,表明沒有瀏覽商品
                 if(cookie == null){
                %>
                 <h2> 您還沒有瀏覽任何商品! </h2>
                <%
                }else{
                    // 不是空,表明有瀏覽記錄
                    String[] ids = cookie.getValue().split("#");
                    for(String id : ids){
                %>
                <li style="width: 150px;height: 216;text-align: center;"><img src="products/1/cs1000<%=id %>.jpg" width="130px" height="130px" /></li>
                <%
                    }
                }
                %>
package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.dashucoding.util.CookieUtil;

public class ProductInfoServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        Cookie[] cookies = request.getCookies();
        Cookie cookie = CookieUtil.findCookie(cookies, "history");
        if (cookie==null) {
            Cookie cook = new Cookie("history", id);
            cook.setMaxAge(60*60*24*7);
            response.addCookie(cook);
        }else{
            String id2 = cookie.getValue();
            cookie.setValue(id+"#"+id2);
            cookie.setMaxAge(60*60*24*7);
            response.addCookie(cookie);
        }
        response.sendRedirect("product_info.htm");
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

清除瀏覽記錄

清除cookie

package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ClearHistory
 */
public class ClearHistory extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // 清除cookie
        Cookie c = new Cookie("history", "");
        c.setMaxAge(0);
//      c.setPath("/demo1");
        response.addCookie(c);
        response.sendRedirect("product_list.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

獲取cookie,添加cookie

request.getCookie();
response.addCookie();

Cookie分類

cookie.setMaxAge(0); // 刪除
cookie.setMaxAge(100); // 100秒

Cloneable

創建一個cookie,cookieservlet發送到web瀏覽器中的少量信息,這些信息是由瀏覽器保存,然後發送回到伺服器中.

cookie的值是唯一標識客戶端的,可以用於cookie會話管理.一個cookie擁有一個名,值,可以有一些可選屬性.但又cookie也存在一些問題.瀏覽器支持每個web伺服器又20個cookie,共有300個cookie,每個限制在4KB.

安全隱患,大小與個數限制.

Session

會話,Session是基於Cookie的一種會話機制.Cookie是伺服器返回一部分小數據在客戶端,存放在客戶端上.

Session是把數據存放在服務端.

interface httpsession

public interface httpSession

常用的方法

package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Demo01
 */
public class Demo01 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        HttpSession session = request.getSession();
        // 得到會話ID
        session.getId();
        // 存值
        session.setAttribute(name, value);
        // 取值
        session.getAttribute(name);
        // 移植
        session.removeAttribute(name);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

效果

效果

// web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SessionDemo02</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <description></description>
    <display-name>LoginServlet</display-name>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.dashucoding.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>
// LoginServlet
package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("收到請求了");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
// login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form action="login">
        賬號: <input type="text"  name="username"/><br>
        密碼: <input type="text"  name="password"/><br>
        <input type="submit"  value="登錄"/><br>
    </form>
</body>
</html>

session創建與銷毀

創建 request.getSession();
銷毀 Redis session 存放在伺服器記憶體中的數據
session關閉伺服器銷毀
session會話時間過期
// 可以改的 conf\web.xml 有效期30分鐘
<session-config>
 <session-timeout>30</session-timeout>
</session-config>
package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        response.setContentType("text/html;charset=utf-8");
        
        String sessionid = request.getSession().getId();
        System.out.println("sessionid="+sessionid);
        // cookid id -> sessionid
        response.getWriter().write("收到請求了");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

session分析

商品列表添加商品,點擊商品添加到購物車,到servlet.

獲取點擊商品標識id,存儲到購物車,跳轉界面.

判斷購物車是否有商品,有數量加1,沒有數量等於1.

購物車

效果

效果

效果

package com.dashucoding.servlet;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CarServlet
 */
public class CarServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        response.setContentType("text/html;charset=utf-8");
        // 獲取添加到購物車的商品id
        int id = Integer.parseInt(request.getParameter("id"));
        // cat dog big pig
        String [] names = {"cat","dog","big","pig"};
        // 取到id對應商品
        
        String name = names[id];
        
        // 獲取購物車存放東西的session
        // 把一個map 對象存放到session裡面去,保證只有一次
        
        Map<String, Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cat");
        
        if(map == null) {
            // value -> map
            
            map = new LinkedHashMap<String, Integer>();
            
            request.getSession().setAttribute("cat", map);
        }
        
        // 判斷購物車裡有沒有該商品
        if(map.containsKey(name)) {
            // 在原來基礎上 +1
            map.put(name, map.get(name)+1);
        }else {
            map.put(name, 1);
        }
        
        response.getWriter().write("<a href='product_list.jsp'><h2>繼續購物</h2></a>");
        response.getWriter().write("<a href='cart.jsp'><h2>去購物車結算</h2></a>");
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <a href="CarServlet?id=0"><h2>cat</h2></a><br>
 <a href="CarServlet?id=1"><h2>dog</h2></a><br>
 <a href="CarServlet?id=2"><h2>big</h2></a><br>
 <a href="CarServlet?id=3"><h2>pig</h2></a><br>
</body>
</html>

效果

效果

// cart.jsp
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 您的購物車商品如下:
 <%
  // 獲取到map
  Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cat");
  // 遍歷
  if(map != null){
      for(String key : map.keySet()){
          int value = map.get(key);
          // key:商品名稱 value:商品名稱
          // <h3>名稱: 數量: </h3>
  %>
        <h3>名稱: <%=key %> 數量: <%=value %></h3><br>
  <%
      }
  }
  %>
</body>
</html>

效果

package com.dashucoding.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class ClearCartServlet
 */
public class ClearCartServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        
        HttpSession session = request.getSession();
        
        // cat購物車
        session.removeAttribute("cat");
        response.sendRedirect("cart.jsp");
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 您的購物車商品如下:
 <%
  // 獲取到map
  Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cat");
  // 遍歷
  if(map != null){
      for(String key : map.keySet()){
          int value = map.get(key);
          // key:商品名稱 value:商品名稱
          // <h3>名稱: 數量: </h3>
  %>
        <h3>名稱: <%=key %> 數量: <%=value %></h3><br>
  <%
      }
  }
  %>
  <a href="ClearCartServlet"><h4>清空購物車</h4></a>
</body>
</html>

效果

public void invalidate()
使用,會話無效,取消對任何綁定到它的對象.
// 強制幹掉會話
// session.invalidate();

小結

cookie和session

Cookie
獲取上一次訪問時間,獲取瀏覽記錄,數據存放在客戶端

Session
會話技術,數據存放在服務端

setAttribute 存放數據
getAttribute 取數據
removeAttribute 移除
getSessionId() 獲取會話id
invalidate() 讓會話失效
response.addCookie(new Cookie())
request.getSession 創建

如果看了覺得不錯

點贊!轉發!

達叔小生:往後餘生,唯獨有你
You and me, we are family !
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: 達叔小生
https://www.jianshu.com/u/c785ece603d1

結語

  • 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
  • 小禮物走一走 or 點贊

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. 範圍不同 readonly 只對 <input> 和 <textarea> 標簽有效 disabled 對所有表單元素都有效, 包括:<input>, <textarea>, <button>, <label>, <option>, <select>等 二. 程度不同 readonly 只是將 ...
  • 昨天碰到這樣一個場景,調用後端介面返回的數據發現所有數據都是正常的,只有一個商品ID的最後兩位是錯的,每一個商品都是,導致無法進行商品的上下架和刪除, 經過查資料發現: 瀏覽器解析數字的坑,一旦超出一定長度最後兩位會精度失準變為兩位隨機數,所以出現這種問題先列印出來 typeof(出錯的數字欄位), ...
  • 一、需求背景: 二、Dubbo和Spring Cloud 的比較 首先Dubbo是一個分散式服務框架,以及SOA治理方案。它的功能主要包括:高性能NIO通訊及多協議集成,服務動態定址與路由,軟負載均衡與容錯,依賴分析與降級等,它是著名的阿裡服務治理的核心框架。Spring Cloud更加關心為開發人 ...
  • 一個分散式服務集群管理通常需要一個協調服務,提供服務註冊、服務發現、配置管理、組服務等功能,而協調服務自身應是一個高可用的服務集群,ZooKeeper是廣泛應用且眾所周知的協調服務。協調服務自身的高可用需要選舉演算法來支撐,本文將講述選舉原理並以分散式服務集群NebulaBootstrap的協調服務N ...
  • 其旨在打造一個集應用開發、大數據存儲、處理、分散式計算、自動化部署的無節點微服務集中開發與運行平臺,以響應業務的快速變更,滿足系統對大數據,大併發與開發效率的需求; 平臺設計以數據為核,以groovy腳本為基礎,通過提供api、非同步消息處理、調度等基礎構件來支持應用的快速開發; 核心是通過整合現有開 ...
  • 對象實例化過程: 1.看類是否已載入,未載入的話先初始化類。 2.在堆記憶體中分配空間。 3.初始化父類的屬性 4.初始化父類的構造方法 5.初始化子類的屬性 6.初始化子類的構造方法 實例: package com.xm.load; public class Animal { static Stri ...
  • 我相信對於很多愛好和習慣寫博客的人來說,如果自己的博客有很多人閱讀和評論的話,自己會非常開心,但是你發現自己用心寫的博客卻沒什麼人看,多多少少會覺得有些傷心吧?我們今天就來看一下為什麼你的博客沒人看呢? 一、頁面分析 首先進入博客園首頁,可以看到一頁有20篇博客簡介,然後有200頁,也就是說總共有2 ...
  • 使用static關鍵字修飾的變數和方法為靜態變數、靜態方法。 非靜態方法可以訪問靜態變數/方法和非靜態變數/方法,但靜態方法只能訪問靜態變數/方法。 可以看到在靜態方法中調用非靜態變數和非靜態方法時,Java會報錯。 所謂的靜態是指變數或方法可以不依賴對象而直接使用類名來調用,這也是static的意 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...