springboot普通類中如何獲取session問題
Spring中普通類獲取session
項目中日志功能
記錄所有通過后臺操作的記錄,記錄項有
時間、操作員、功能模塊、操作內(nèi)容
寫了一個基于注解方式的aop,實現(xiàn)日志功能
使用shiro的話可以直接獲取到用戶的token,然后獲取到用戶登錄信息
可是項目中沒有使用token,使用的是session綁定登錄信息,需要在@Aspect中獲取到用戶信息
解決方案
public class ServletUtil { ? ? public static ServletRequestAttributes getRequestAttributes() { ? ? ? ? return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); ? ? } ? ? public static HttpServletRequest getRequest() { ? ? ? ? return getRequestAttributes().getRequest(); ? ? } }
SpringBoot中使用session
基礎(chǔ)知識
Cookie
- Cookie由服務(wù)器端創(chuàng)建,然后添加到 HttpServletResponse 中發(fā)送給客戶端(瀏覽器)。
- 可以添加多個cookie鍵值對。
- Cookie 由鍵值名和鍵值組成。相同 domain 和 path 中的鍵值名不能重復(fù),添加鍵值名重名的鍵值對會覆蓋上一個同名的鍵值對。
- 添加 Cookie 時,需要指定cookie所在域(setDomain), 路徑(setPath),指定存在時長(setMaxAge)。
- 服務(wù)端創(chuàng)建好cookie后提交給客戶端,之后瀏覽器的每次請求(HttpServletRequest)里都會攜帶cookie數(shù)組。
- springmvc有兩種方式獲?。海?)在控制器函數(shù)中通過對參數(shù)注解@CookieValue(鍵值名),獲取指定某個cookie。(2)通過 HttpServletRequest 中的 getcookies 方法獲取 cookie 數(shù)組,然后迭代里面的每一個 cookie 鍵值對。
Session
- 服務(wù)器會根據(jù)客戶端的請求 HttpServletRequest 創(chuàng)建 session=request.getSession()。
- 每一個 session 都有一個唯一的標(biāo)示 sessionID ,可通過 request.getSession().getId()獲得。
- session是存儲在服務(wù)器端的,每一個 session 都有一個id,當(dāng)創(chuàng)建一個 session 后,會將該 sessionID 存放到此次訪問的 cookie 中,當(dāng)下次客戶端的訪問到來需要提取服務(wù)器中的 session時,會根據(jù)訪問中 cookie 里的 sessionID 值來找到服務(wù)器中的具體 session。
- 訪問靜態(tài)資源時不會創(chuàng)建 session
- 服務(wù)器會把長時間沒有活動的 session 從服務(wù)器內(nèi)存中清除,此時 session 便失效。Tomcat 中 session的默認(rèn)失效時間為 20分鐘
- Tomcat 7以上的版本中默認(rèn)禁止客戶端腳本讀取session Id,需要在context.xml中設(shè)置useHttpOnly=”false”,開啟權(quán)限。
在 Spring Boot中使用
設(shè)置useHttpOnly
jar 項目
在配置文件中設(shè)置:
server.servlet.session.cookie.http-only=false
war項目
在context.xml文件中的Context添加屬性useHttpOnly
<Context useHttpOnly="false"><Context>
設(shè)置Cookie
場景:首次請求時跳轉(zhuǎn)到指定頁面,頁面再通過ajax向后臺請求數(shù)據(jù),進(jìn)行頁面渲染。跳轉(zhuǎn)頁面時,需要指定cookie,否則會出現(xiàn)項目部署到外部tomcat時,cookie無法寫入的情況,造成ajax請求時,兩次的sessionId不一致。
@RequestMapping(value="/query", method=RequestMethod.GET) public ModeAndView queryInfo(@RequestParam(value="sq")String sq, ? ? ? ? ? ? ? ? ? ? ? ? ? HttpServletRequest request, ? ? ? ? ? ? ? ? ? ? ? ? ? HttpServletResponse response ? ? ? ? ? ? ? ? ? ? ? ? ? ) { ? ? ? ? ModeAndView view = new ModeAndView(); ? ? ? //... view 操作 ? ? ? Cookie[] cookies = request.getCookies(); ? ? ? String sessionId = request.getSession().getId(); ? ? ? if (cookies == null) { ? ? ? ? ? Cookie cookie = new Cookie("JSESSIONID", sessionId); ? ? ? ? ? cookie.setMaxAge(5 * 60); ? ? ? ? ? cookie.setDomian("localhost"); ? ? ? ? ? cookie.setPath("/hand"); ? ? ? ? ? response.addCookie(cookie); ? ? ? } else { ? ? ? ? ? for (Cookie cookie : cookies) { ? ? ? ? ? ? ? if (cookie.getName().equals("JSESSIONID")) { ? ? ? ? ? ? ? ? ? cookie.setMaxAge(5 * 60); ? ? ? ? ? ? ? ? ? cookie.setValue(sessionId); ? ? ? ? ? ? ? ? ? cookie.setDomain("localhost"); ? ? ? ? ? ? ? ? ? cookie.setPath("/hand"); ? ? ? ? ? ? ? ? ? response.addCookie(cookie); ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? } ? ? ? ? ? } ? ? ? } ? ? ? ? return view; }
ajax 請求時帶上cookie
在請求列表中加上xhrFields參數(shù)。
var s = $.ajax({ ? type: "get", ? timeout: 8000, ? xhrFields: { withCredentials: true}, ? url: "/hand/val", ? data: {"params": ""}, ? success: function(rel) { ? ? ? console.log(rel) ? }, ? error: function() { ? ? ? console.log("failed") ? }, ? complete: function(XMLHttpRequest, status) { ? ? ? if (status == "timeout") { ? ? ? ? ? s.abort(); ? ? ? ? ? console.log("timeout"); ? ? ? } ? } })
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- SpringBoot3整合MyBatis出現(xiàn)異常:Property?'sqlSessionFactory'or?'sqlSessionTemplate'?are?required
- SpringBoot集成redis與session實現(xiàn)分布式單點登錄
- SpringBoot Session接口驗證實現(xiàn)流程詳解
- SpringBoot整合SpringSession實現(xiàn)分布式登錄詳情
- SpringBoot?整合?Spring-Session?實現(xiàn)分布式會話項目實戰(zhàn)
- 詳解SpringBoot中@SessionAttributes的使用
- SpringBoot中HttpSessionListener的簡單使用方式
- SpringBoot2.x設(shè)置Session失效時間及失效跳轉(zhuǎn)方式
- SpringBoot下實現(xiàn)session保持方式
- Spring?Session(分布式Session共享)實現(xiàn)示例
相關(guān)文章
SpringBoot監(jiān)控模塊Actuator的用法詳解
Spring?Boot?Actuator?是?Spring?Boot?自帶的一個功能模塊,提供了一組已經(jīng)開箱即用的生產(chǎn)環(huán)境下常用的特性和服務(wù),比如應(yīng)用程序的健康檢查、信息暴露、度量收集、日志記錄等,本文將給大家詳細(xì)SpringBoot監(jiān)控模塊Actuator的用法2023-06-06Spring超詳細(xì)講解事務(wù)和事務(wù)傳播機(jī)制
Spring事務(wù)的本質(zhì)就是對數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務(wù)開始時,根據(jù)當(dāng)前設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫的隔離級別,由此保持一致2022-06-06淺談選擇、冒泡排序,二分查找法以及一些for循環(huán)的靈活運(yùn)用
下面小編就為大家?guī)硪黄獪\談選擇、冒泡排序,二分查找法以及一些for循環(huán)的靈活運(yùn)用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06Java實現(xiàn)斗地主與猜數(shù)字游戲詳細(xì)流程
這篇文章主要介紹了怎么用Java來寫斗地主種洗牌和發(fā)牌的功能,以及猜數(shù)字的游戲,斗地主相信大家都知道,同時也知道每一局都要洗牌打亂順序再發(fā)牌,本篇我們就來實現(xiàn)它們能,感興趣的朋友跟隨文章往下看看吧2022-04-04Java 8中map()和flatMap()方法區(qū)別詳解
這篇文章主要為大家介紹了Java 8中map()和flatMap()方法區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個錯誤及最新解決方案
使用聲明式事務(wù)@Transactional進(jìn)行事務(wù)一致性的管理,在開發(fā)過程中,發(fā)現(xiàn)很多開發(fā)同學(xué)都用錯了spring聲明式事務(wù)@Transactional或使用不規(guī)范,導(dǎo)致出現(xiàn)各種事務(wù)問題,這篇文章主要介紹了spring聲明式事務(wù)@Transactional開發(fā)常犯的幾個錯誤及解決辦法,需要的朋友可以參考下2024-02-02SpringBoot整合EasyExcel實現(xiàn)導(dǎo)入導(dǎo)出功能
EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具,他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能,本文就給大家介紹一下SpringBoot整合EasyExcel實現(xiàn)導(dǎo)入導(dǎo)出功能的方法,需要的朋友可以參考下2023-09-09