標籤:java cookie 刪除
今天在處理一個刪除cookie的需求.我在查詢頁面的時候將查詢條件添加到了cookie中,這樣,下一次查詢的時候,我就可以帶上上一次查詢的條件.但是,再切換組織機構和退出登入的時候,需要刪除所有的cookie.
//這裡為了說明問題,只是嵌入了代碼的一部分@RequestMappingpublic ModelAndView index(@RequestParam(value = "channelName", required = false) String channelName,@RequestParam(value = "channelStatus", required = false) String channelStatus,@RequestParam(value = "mediaId", required = false) Long mediaId,@RequestParam(value = "pageIndex", required = false) Integer pageIndex,@RequestParam(value = "pageSize", required = false) Integer pageSize,HttpSession session, HttpServletRequest request,HttpServletResponse response) {// 如果請求參數為空白,從cookie中擷取參數;如果請求參數不為空白,寫入cookie中儲存,為下次查詢提供參數/* * 操作cookie--如果沒有帶條件,則從cookie中讀取條件 * 規則:當條件全部為空白時,從cookie讀取.當條件有一個不為空白時 * 讀取條件,並儲存到cookie中. */if (channelName == null && channelStatus == null && pageIndex == null&& pageSize == null && mediaId == null) {for (Cookie cookie : request.getCookies()) {if (cookie.getName().equalsIgnoreCase("pmc.channelName")) {channelName = java.net.URLDecoder.decode(cookie.getValue());}if (cookie.getName().equalsIgnoreCase("pmc.channelStatus")) {channelStatus = cookie.getValue();}if (cookie.getName().equalsIgnoreCase("pmc.pageIndex")) {pageIndex = Integer.valueOf(cookie.getValue());}if (cookie.getName().equalsIgnoreCase("pmc.pageSize")) {pageSize = Integer.valueOf(cookie.getValue());}if (cookie.getName().equalsIgnoreCase("pmc.mediaId")) {mediaId = Long.valueOf(cookie.getValue());}}} else {if (channelName != null) {response.addCookie(new Cookie("pmc.channelName", java.net.URLEncoder.encode(channelName)));}else{ //儲存cookie的代碼.cookie2.setMaxAge(0);設定瀏覽器關閉時,cookie到期Cookie cookie2=new Cookie("pmc.channelName", null);cookie2.setMaxAge(0);response.addCookie(cookie2);}if (channelStatus != null) {response.addCookie(new Cookie("pmc.channelStatus",channelStatus));}else{ //儲存cookie的代碼.cookie2.setMaxAge(0);設定瀏覽器關閉時,cookie到期Cookie cookie2=new Cookie("pmc.channelStatus", null);cookie2.setMaxAge(0);response.addCookie(cookie2);}if (pageIndex != null) {response.addCookie(new Cookie("pmc.pageIndex", pageIndex.toString()));}if (pageSize != null) {response.addCookie(new Cookie("pmc.pageSize", pageSize.toString()));}if (mediaId != null) {response.addCookie(new Cookie("pmc.mediaId",mediaId.toString()));}else{ //儲存cookie的代碼.cookie2.setMaxAge(0);設定瀏覽器關閉時,cookie到期Cookie cookie2=new Cookie("pmc.mediaId", null);cookie2.setMaxAge(0);response.addCookie(cookie2);}}
我的目標,就是把這裡的cookie,在退出登入時刪除掉.這樣的cookie值有很多,在整個系統的每一個index.do查詢中都有.我要做的,就是在退出時,擷取所有的cookie,然後將其刪除.我是這樣做的
/** 執行退出 */@RequestMapping(value = "/logout")public ModelAndView logout(HttpServletRequest request,HttpServletResponse response,HttpSession session) { // 擷取Cookies數組 Cookie[] cookies = request.getCookies(); // 迭代尋找並清除Cookie for (Cookie cookie: cookies) { //將cookie.setMaxAge(0)表示刪除cookie. cookie.setMaxAge(0); cookie.setPath("/"); response.addCookie(cookie); }// 修改使用者登陸日誌AuthorizedUser authorizedUser = (AuthorizedUser) session.getAttribute("authorizedUser");logService.updateLoginLog(authorizedUser.getLoginLogId());// 銷毀使用者sessionsession.invalidate();// 跳轉到首頁ModelAndView mv = new ModelAndView("redirect:/");return mv;}
然而,在這個過程中,發現了問題.在退出時,使用request.getCookies()擷取所有的cookie時,始終都只能擷取到一個系統產生的cookie.而我自己手動設定的那些個cookie根本擷取不到.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/71/78/wKioL1XRjauBF7flAAQViDNiTU4945.jpg" title="2.png" alt="wKioL1XRjauBF7flAAQViDNiTU4945.jpg" />
經過查閱資料和實驗.終於找到了問題的原因.原因在cookie2.setMaxAge(0);看看一我們是如何設定:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/71/7B/wKiom1XRh__g9KrGAAQnhZwWi1o988.jpg" title="1.png" alt="wKiom1XRh__g9KrGAAQnhZwWi1o988.jpg" />
將cookie2.setMaxAge(0);表示,刪除當前這個cookie.所以,你在其他任何地方都讀取不到這個cookie.由於我沒有設定cookie.setPath()和cookie.setDomain().所有沒有實現真正的刪除,為什麼沒有刪除呢,可以參考這篇文章: http://tompig.iteye.com/blog/714295
通過查閱資料和測試找到解決方案:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/71/78/wKioL1XRjiDQ0XJVAAHDiBe9x_8580.jpg" title="3.png" alt="wKioL1XRjiDQ0XJVAAHDiBe9x_8580.jpg" />
設定的cookie2.setMaxAge(-1)才真正表示關閉瀏覽器,cookie失效.
終於找到了為什麼在退出登入時擷取不到cookie的原因了.
現在問題又來了,我不能真正實現cookie刪除.這個問題網上的解釋比較多.
網上說,刪除cookie是必須要設定setPath()和setDomain()兩個參數.經過親自測試:我只設定了setPath()就刪除了cookie了.
添加cookie時,設定setPath();
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/7B/wKiom1XRkWDgb2BKAADundZHYQM153.jpg" title="5.png" alt="wKiom1XRkWDgb2BKAADundZHYQM153.jpg" />
刪除cookie時,也要設定setPath();
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/7B/wKiom1XRkcGAQQjlAAJy8IpH5yo973.jpg" title="6.png" alt="wKiom1XRkcGAQQjlAAJy8IpH5yo973.jpg" />
這個問題終於被解決了.
java中使用request.getCookies刪除所有cookie