Cookie意爲「甜餅」,是由W3C組織提出,最先由Netscape社區發展的一種機制。html
Cookie其實是一小段的文本信息。客戶端請求服務器,若是服務器須要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還能夠根據須要修改Cookie的內容。java
單點登陸中可利用cookie設置完成。跨域
可在瀏覽器中查看cookie,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"; } }
@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; }
cookie不能主動刪除,如需刪除cookie,可從新設置cookie,將有效時間改成0便可。cookie
Cookie cookie = new Cookie("username", username); cookie.setMaxAge(0);//讓cookie失效 //把cookie返回給瀏覽器 response.addCookie(cookie);
Session是另外一種記錄客戶狀態的機制,不一樣的是Cookie保存在客戶端瀏覽器中,而Session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。session
Session對應的類爲javax.servlet.http.HttpSession類。併發
建立對象:app
HttpSession session = request.getSession();
調用方法:
String getAttribute(String attribute)讀客戶狀態信息 void setAttribute(String attribute, Object value)方法寫客戶狀態信息 void setMaxInactiveInterval(int second) 設置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 + "添加到購物車"; } }
@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)做用範圍:在一次會話範圍內(獲取到的都是同一個session對象)
(3)主要功能:在整個會話範圍內實現數據的共享
Cookie和session都屬於會話技術,均可以保存會話中產生的數據,但因爲cookie 和session的工做原理和特色不一樣,所以二者的應用場景也不同。
Cookie的特色:
Session的特色:
功能分核心業務功能和擴展功能。
核心業務功能如登陸,添加購物車,查詢訂單。
擴展功能如計算時間,身份驗證,日誌,擴展功能放在Interceptor中,訪問controller時自動執行。不修改controller代碼就實現了擴展功能。這種方式也叫無侵入性編碼,動態代理。
自定義攔截器實現了HandlerInterceptor接口,並實現了接口中的三個方法:
建立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); } }