SSM-Cookie、Session、攔截器Interceptor

1 Cookie

Cookie意爲「甜餅」,是由W3C組織提出,最先由Netscape社區發展的一種機制。html

Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。java

單點登陸中可利用cookie設置完成。跨域

可在瀏覽器中查看cookie,cookie不能跨域。一對一的關係。
image.png瀏覽器

1.1 設置Cookie

Cookie知識介紹:安全

1.cookie.setPath("/") 表明根目錄有效
    url1:www.jt.com/addUser
    url2:www.jt.com/user/addUser
2.cookie.setDomain("域名地址") cookie在哪些域名中共享
    例子1:cookie.setDomain("www.jt.com");//只有在www.jt.com中共享
    cookie.setDomain("jt.com");//在jt.com中共享
3.cookie.setMaxAge(30*24*60*60);//讓cookie30天有效。
4.Cookie cookie = new Cookie("JT_TICKET",uuid);
    設置cookie的name和值

例如:服務器

@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(String username, HttpServletResponse response) {
        //建立cookie
        Cookie cookie = new Cookie("username", username);
        //把cookie返回給瀏覽器
        response.addCookie(cookie);
        return "設置cookie";
    }
}

1.2 讀取Cookie

@RestController
public class OrderController {

    @RequestMapping("/getOrder")
    public String getOrder(HttpServletRequest request) {
        //讀取全部cookie
        Cookie[] cookies = request.getCookies();
        String string = "";
        if (cookies != null) {
            //遍歷cookie
            for (Cookie cookie : cookies) {
                //取cookie名
                String cookieName = cookie.getName();
                //取cookie值
                String cookieValue = cookie.getValue();
                string = string + cookieName + cookieValue;
            }
        }
        return string;
    }

1.3 「刪除」Cookie

cookie不能主動刪除,如需刪除cookie,可從新設置cookie,將有效時間改成0便可。cookie

Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(0);//讓cookie失效
//把cookie返回給瀏覽器
response.addCookie(cookie);

2 Session

Session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。session

Session對應的類爲javax.servlet.http.HttpSession類。併發

  1. Session是將會話中產生的數據保存在服務器端,是服務器端技術
  2. Session是一個域對象,session中也保存了一個map集合,往session中存數 據,其實就是將數據保存到session的map集合中。
  3. 經過session.setAttribute()方法能夠將數據保存到session中,經過 session.getAttribute()方法能夠將數據從session中取出來。

建立對象:app

HttpSession session = request.getSession();

調用方法:

String getAttribute(String attribute)讀客戶狀態信息
void setAttribute(String attribute, Object value)方法寫客戶狀態信息
void setMaxInactiveInterval(int second) 設置Session的超時時間。單位爲秒

2.1 設置Session

@RestController
public class CartController {

    @RequestMapping("/insert")
    public String insert(String itemName, HttpSession session) {
        //session內部是有hashmap,用來存放數據
        
        //找到購物車
        ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
        //判斷購物車是否爲空
        if (cart == null) {
            //建立購物車
            cart = new ArrayList();
            
            //保存購物車
            session.setAttribute("cart", cart);
        }
        //向購物車添置商品
        cart.add(itemName);
        return itemName + "添加到購物車";
    }
}

2.2 獲取Session

@RequestMapping("/list")

    public String list(HttpServletRequest request, HttpSession session) {
        String string = "";
        //找到購物車
        ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
        //判斷購物車是否爲空
        if (cart != null) {
            //遍歷商品
            for (String itemName : cart) {
                string = string + "itemName:" + itemName;
            }
        }
        return string;
    }

2.3 銷燬session

  1. 超時銷燬:默認狀況下,當超過30分鐘沒有訪問session,session就會超時 銷燬。(30分鐘是默認時間,能夠修改,但不推薦修改)
  2. 自殺:調用session的invalidate方法時,會當即銷燬session。
  3. 意外身亡:當服務器非正常關閉時(硬件損壞,斷電,內存溢出等致使服 務器非正常關閉),session會隨着服務器的關閉而銷燬; 當服務器正常關閉,在關閉以前,服務器會將內部的session對象序列化保 存到服務器的work目錄下,變爲一個文件。這個過程叫作session的鈍化 (序列化);再次將服務器啓動起來,鈍化着的session會再次回到服務 器,變爲服務器中的對象,這個過程叫作session的活化(反序列化)。

(2)做用範圍:在一次會話範圍內(獲取到的都是同一個session對象)
(3)主要功能:在整個會話範圍內實現數據的共享

cookie和session的區別

Cookie和session都屬於會話技術,均可以保存會話中產生的數據,但因爲cookie 和session的工做原理和特色不一樣,所以二者的應用場景也不同。

Cookie的特色:

  1. cookie是將會話中產生的數據保存在瀏覽器客戶端, 是客戶端技術(JS能夠 訪問cookie)
  2. cookie是將數據保存在客戶端瀏覽器,容易隨着用戶的操做致使cookie丟失或者被竊取,所以cookie中保存的數據不太穩定,也不太安全。
  3. 但cookie將數據保存在客戶端,對服務器端沒有太多影響,能夠將數據保存很長時間。
  4. 總結:所以cookie中適合存儲須要長時間保存、但對安全性要求不高的數 據
  5. 瀏覽器對cookie的大小和個數都有限制,通常推薦每個站點給瀏覽器發送的cookie數量不超過20個,每個cookie的大小不超過1kb。
  6. Cookie的應用:實現購物車、記住用戶名、30天內自動登陸等。

Session的特色:

  1. session是將會話中產生的數據保存在服務器端,是服務器端技術
  2. session將數據存在服務器端的session對象中,相對更加的安全,並且更加穩定。不容易隨着用戶的操做而致使session中的數據丟失或者是被竊取。
  3. 但session是服務器端的對象,在併發量較高時每個瀏覽器客戶端在服務器端都要對應一個session對象,佔用服務器的內存空間,影響效率。
  4. 總結:所以session中適合存儲對安全性要求較高,但不須要長時間保存的數據。
  5. Session的應用:保存登陸狀態、保存驗證碼。

攔截器Interceptor

功能分核心業務功能和擴展功能。
核心業務功能如登陸,添加購物車,查詢訂單。
擴展功能如計算時間,身份驗證,日誌,擴展功能放在Interceptor中,訪問controller時自動執行。不修改controller代碼就實現了擴展功能。這種方式也叫無侵入性編碼,動態代理

自定義攔截器實現了HandlerInterceptor接口,並實現了接口中的三個方法:

  • preHandle() 方法:該方法會在控制器方法前執行,其返回值表示是否中斷後續操做。當其返回值爲true時,表示繼續向下執行; 當其返回值爲false時,會中斷後續的全部操做(包括調用下一個攔截器和控制器類中的方法執行等)。
  • postHandle()方法:該方法會在控制器方法調用以後,且解析視圖以前執行。能夠經過此方法對請求域中的模型和視圖作出進一步的修改。
  • afterCompletion()方法:該方法會在整個請求完成,即視圖渲染結束以後執行。能夠經過此方法實現一些資源清理、記錄日誌信息等工做。

實現身份驗證功能

建立AuthInterceptor攔截器:

public class AuthInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler)
            throws Exception {
        String url=request.getRequestURI();
        System.out.println(url+" AuthInterceptor.preHandle()");
        
        //判斷用戶有沒有登陸
        HttpSession session=request.getSession();
        String username=(String) session.getAttribute("username");
        if (StringUtils.isEmpty(username)) {
            response.sendRedirect("/login.html");
return false;// false 不執行controller,postHandle()
        }
        return true;// false 不執行controller,postHandle()
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("AuthInterceptor.postHandle()");

        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

}

在配置文件config中添加authInterceptor:
將config對象交給bean容器進行管理。

@Component//這是個組件,框架會自動建立對象
public class WebConfig implements WebMvcConfigurer{

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
        AuthInterceptor authInterceptor=new AuthInterceptor();        
        registry.addInterceptor(authInterceptor).addPathPatterns("/getOrder","/list");
        
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
相關文章
相關標籤/搜索