springboot普通類中如何獲取session問題
Spring中普通類獲取session
項(xiàng)目中日志功能
記錄所有通過后臺(tái)操作的記錄,記錄項(xiàng)有
時(shí)間、操作員、功能模塊、操作內(nèi)容
寫了一個(gè)基于注解方式的aop,實(shí)現(xiàn)日志功能
使用shiro的話可以直接獲取到用戶的token,然后獲取到用戶登錄信息
可是項(xiàng)目中沒有使用token,使用的是session綁定登錄信息,需要在@Aspect中獲取到用戶信息
解決方案
public class ServletUtil {
? ? public static ServletRequestAttributes getRequestAttributes() {
? ? ? ? return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? }
? ? public static HttpServletRequest getRequest() {
? ? ? ? return getRequestAttributes().getRequest();
? ? }
}SpringBoot中使用session
基礎(chǔ)知識(shí)
Cookie
- Cookie由服務(wù)器端創(chuàng)建,然后添加到 HttpServletResponse 中發(fā)送給客戶端(瀏覽器)。
- 可以添加多個(gè)cookie鍵值對(duì)。
- Cookie 由鍵值名和鍵值組成。相同 domain 和 path 中的鍵值名不能重復(fù),添加鍵值名重名的鍵值對(duì)會(huì)覆蓋上一個(gè)同名的鍵值對(duì)。
- 添加 Cookie 時(shí),需要指定cookie所在域(setDomain), 路徑(setPath),指定存在時(shí)長(setMaxAge)。
- 服務(wù)端創(chuàng)建好cookie后提交給客戶端,之后瀏覽器的每次請(qǐng)求(HttpServletRequest)里都會(huì)攜帶cookie數(shù)組。
- springmvc有兩種方式獲?。海?)在控制器函數(shù)中通過對(duì)參數(shù)注解@CookieValue(鍵值名),獲取指定某個(gè)cookie。(2)通過 HttpServletRequest 中的 getcookies 方法獲取 cookie 數(shù)組,然后迭代里面的每一個(gè) cookie 鍵值對(duì)。
Session
- 服務(wù)器會(huì)根據(jù)客戶端的請(qǐng)求 HttpServletRequest 創(chuàng)建 session=request.getSession()。
- 每一個(gè) session 都有一個(gè)唯一的標(biāo)示 sessionID ,可通過 request.getSession().getId()獲得。
- session是存儲(chǔ)在服務(wù)器端的,每一個(gè) session 都有一個(gè)id,當(dāng)創(chuàng)建一個(gè) session 后,會(huì)將該 sessionID 存放到此次訪問的 cookie 中,當(dāng)下次客戶端的訪問到來需要提取服務(wù)器中的 session時(shí),會(huì)根據(jù)訪問中 cookie 里的 sessionID 值來找到服務(wù)器中的具體 session。
- 訪問靜態(tài)資源時(shí)不會(huì)創(chuàng)建 session
- 服務(wù)器會(huì)把長時(shí)間沒有活動(dòng)的 session 從服務(wù)器內(nèi)存中清除,此時(shí) session 便失效。Tomcat 中 session的默認(rèn)失效時(shí)間為 20分鐘
- Tomcat 7以上的版本中默認(rèn)禁止客戶端腳本讀取session Id,需要在context.xml中設(shè)置useHttpOnly=”false”,開啟權(quán)限。

在 Spring Boot中使用
設(shè)置useHttpOnly
jar 項(xiàng)目
在配置文件中設(shè)置:
server.servlet.session.cookie.http-only=false
war項(xiàng)目
在context.xml文件中的Context添加屬性u(píng)seHttpOnly
<Context useHttpOnly="false"><Context>
設(shè)置Cookie
場景:首次請(qǐng)求時(shí)跳轉(zhuǎn)到指定頁面,頁面再通過ajax向后臺(tái)請(qǐng)求數(shù)據(jù),進(jìn)行頁面渲染。跳轉(zhuǎn)頁面時(shí),需要指定cookie,否則會(huì)出現(xiàn)項(xiàng)目部署到外部tomcat時(shí),cookie無法寫入的情況,造成ajax請(qǐng)求時(shí),兩次的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 請(qǐng)求時(shí)帶上cookie
在請(qǐng)求列表中加上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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot3整合MyBatis出現(xiàn)異常:Property?'sqlSessionFactory'or?'sqlSessionTemplate'?are?required
- SpringBoot集成redis與session實(shí)現(xiàn)分布式單點(diǎn)登錄
- SpringBoot Session接口驗(yàn)證實(shí)現(xiàn)流程詳解
- SpringBoot整合SpringSession實(shí)現(xiàn)分布式登錄詳情
- SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話項(xiàng)目實(shí)戰(zhàn)
- 詳解SpringBoot中@SessionAttributes的使用
- SpringBoot中HttpSessionListener的簡單使用方式
- SpringBoot2.x設(shè)置Session失效時(shí)間及失效跳轉(zhuǎn)方式
- SpringBoot下實(shí)現(xiàn)session保持方式
- Spring?Session(分布式Session共享)實(shí)現(xiàn)示例
相關(guān)文章
SpringMVC實(shí)現(xiàn)簡單跳轉(zhuǎn)方法(專題)
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)簡單跳轉(zhuǎn)方法(專題),詳細(xì)的介紹了SpringMVC跳轉(zhuǎn)的幾種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-03-03
springboot2.3 整合mybatis-plus 高級(jí)功能(圖文詳解)
這篇文章主要介紹了springboot2.3 整合mybatis-plus 高級(jí)功能,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08

