日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

瀏覽:191日期:2023-03-14 09:31:42

最近在學習springboot,session這個點一直困擾了我好久,今天把這些天踩的坑分享出來吧,希望能幫助更多的人。

一、pom.xml配置

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId></dependency>二、application.properties的redis配置

#redisspring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1#超時一定要大于0spring.redis.timeout=3000spring.session.store-type=redis

在配置redis時需要確保redis安裝正確,并且配置notify-keyspace-events Egx,spring.redis.timeout設置為大于0,我當時這里配置為0時springboot時啟不起來。

三、編寫登錄狀態攔截器RedisSessionInterceptor

//攔截登錄失效的請求public class RedisSessionInterceptor implements HandlerInterceptor{ @Autowired private StringRedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//無論訪問的地址是不是正確的,都進行登錄驗證,登錄成功后的訪問再進行分發,404的訪問自然會進入到錯誤控制器中HttpSession session = request.getSession();if (session.getAttribute('loginUserId') != null){ try {//驗證當前請求的session是否是已登錄的sessionString loginSessionId = redisTemplate.opsForValue().get('loginUser:' + (long) session.getAttribute('loginUserId'));if (loginSessionId != null && loginSessionId.equals(session.getId())){ return true;} } catch (Exception e) {e.printStackTrace(); }} response401(response);return false; } private void response401(HttpServletResponse response) {response.setCharacterEncoding('UTF-8');response.setContentType('application/json; charset=utf-8'); try{ response.getWriter().print(JSON.toJSONString(new ReturnData(StatusCode.NEED_LOGIN, '', '用戶未登錄!')));}catch (IOException e){ e.printStackTrace();} } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}四、配置攔截器

@Configurationpublic class WebSecurityConfig extends WebMvcConfigurerAdapter{ @Bean public RedisSessionInterceptor getSessionInterceptor() {return new RedisSessionInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) {//所有已api開頭的訪問都要進入RedisSessionInterceptor攔截器進行登錄驗證,并排除login接口(全路徑)。必須寫成鏈式,分別設置的話會創建多個攔截器。//必須寫成getSessionInterceptor(),否則SessionInterceptor中的@Autowired會無效registry.addInterceptor(getSessionInterceptor()).addPathPatterns('/api/**').excludePathPatterns('/api/user/login');super.addInterceptors(registry); }}五、登錄控制器

@RestController@RequestMapping(value = '/api/user')public class LoginController{ @Autowired private UserService userService; @Autowired private StringRedisTemplate redisTemplate; @RequestMapping('/login') public ReturnData login(HttpServletRequest request, String account, String password) {User user = userService.findUserByAccountAndPassword(account, password);if (user != null){ HttpSession session = request.getSession(); session.setAttribute('loginUserId', user.getUserId()); redisTemplate.opsForValue().set('loginUser:' + user.getUserId(), session.getId()); return new ReturnData(StatusCode.REQUEST_SUCCESS, user, '登錄成功!');}else{ throw new MyException(StatusCode.ACCOUNT_OR_PASSWORD_ERROR, '賬戶名或密碼錯誤!');} } @RequestMapping(value = '/getUserInfo') public ReturnData get(long userId) {User user = userService.findUserByUserId(userId);if (user != null){ return new ReturnData(StatusCode.REQUEST_SUCCESS, user, '查詢成功!');}else{ throw new MyException(StatusCode.USER_NOT_EXIST, '用戶不存在!');} }}六、效果

我在瀏覽器上登錄,然后獲取用戶信息,再在postman上登錄相同的賬號,瀏覽器再獲取用戶信息,就會提示401錯誤了,瀏覽器需要重新登錄才能獲取得到用戶信息,同樣,postman上登錄的賬號就失效了。

瀏覽器:

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

postman:

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

七、核心原理詳解

分布式session需要解決兩個難點:1、正確配置redis讓springboot把session托管到redis服務器。2、唯一登錄。

1、redis:

redis需要能正確啟動到出現如下效果才證明redis正常配置并啟動

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

同時還要保證配置正確

@EnableCaching@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30)//session過期時間(秒)@Configurationpublic class RedisSessionConfig{ @Bean public static ConfigureRedisAction configureRedisAction() {//讓springSession不再執行config命令return ConfigureRedisAction.NO_OP; }}

springboot啟動后能在redis上查到緩存的session才能說明整個redis+springboot配置成功!

SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例

2、唯一登錄:

1、用戶登錄時,在redis中記錄該userId對應的sessionId,并將userId保存到session中。

HttpSession session = request.getSession();session.setAttribute('loginUserId', user.getUserId());redisTemplate.opsForValue().set('loginUser:' + user.getUserId(), session.getId());

2、訪問接口時,會在RedisSessionInterceptor攔截器中的preHandle()中捕獲,然后根據該請求發起者的session中保存的userId去redis查當前已登錄的sessionId,若查到的sessionId與訪問者的sessionId相等,那么說明請求合法,放行。否則拋出401異常給全局異常捕獲器去返回給客戶端401狀態。

唯一登錄經過我的驗證后滿足需求,暫時沒有出現問題,也希望大家能看看有沒有問題,有的話給我點好的建議!

到此這篇關于SpringBoot+SpringSession+Redis實現session共享及唯一登錄示例的文章就介紹到這了,更多相關SpringBoot 唯一登錄內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区激情| 首页国产精品| 国产日产精品_国产精品毛片| 中文字幕av一区二区三区四区| 久久久成人网| av亚洲在线观看| 精品在线99| 亚洲五月综合| 91精品国产自产在线丝袜啪| 国产视频网站一区二区三区| 国产精品久久乐| 国产传媒av在线| 999精品一区| 亚洲另类视频| 欧美高清一区| 激情综合自拍| 国产视频一区三区| 91久久午夜| 欧美精品影院| 国产麻豆久久| 亚洲一二av| 久久av中文| 欧美国产小视频| 免费在线成人网| 美女视频黄免费的久久| 好吊一区二区三区| 国产精品一区二区三区美女 | 国产精品极品在线观看| 国产精品久久久久久久久妇女| 老鸭窝亚洲一区二区三区| 亚洲最新av| 国产精品高清一区二区| 日韩中文在线播放| 综合激情婷婷| 国产精品久久久久久久久免费高清 | 国产欧美一区二区三区精品观看| 日韩一区二区三区免费视频| 国产精品白丝一区二区三区| 国产精品13p| 日本欧美在线看| 日韩国产一二三区| 精品日韩视频| 日韩欧美在线精品| 亚洲成人av观看| 国产精品免费精品自在线观看| 欧美搞黄网站| 激情视频网站在线播放色| 日韩精选在线| 欧美日韩中文| 国产亚洲福利| 国产麻豆精品| 综合国产精品| 蜜臀91精品国产高清在线观看| 国产欧美激情| 亚洲天堂av资源在线观看| 色天使综合视频| 精品网站aaa| 日本三级亚洲精品| 丝袜美腿高跟呻吟高潮一区| 精品99在线| 久久99影视| 欧美二三四区| 六月婷婷一区| 蜜桃tv一区二区三区| 亚洲三级欧美| 国产欧美日本| 亚洲精品自拍| 亚洲在线一区| 在线视频亚洲| 久热精品在线| 亚洲一区二区毛片| 国产模特精品视频久久久久| 激情六月综合| 久久亚洲风情| 日韩av不卡一区二区| 日本一区二区三区中文字幕| 亚洲一区二区三区久久久| 亚洲在线成人| 深夜福利一区| 欧美一区二区三区高清视频 | 牛牛精品成人免费视频| 狠狠操综合网| 狠狠色综合网| 色8久久久久| а√在线中文在线新版| av资源中文在线天堂| 久久天堂av| 丝袜美腿成人在线| 国产精品免费99久久久| 97精品一区二区| 国产精品普通话对白| 蜜桃传媒麻豆第一区在线观看| 午夜久久av| 亚洲一区资源| 欧美日韩免费观看一区=区三区| 亚洲人成网站在线在线观看| 国产精品一区二区三区www| 国产精品99视频| 在线综合视频| 国产精品久久久亚洲一区| 久久久久蜜桃| 国产精品亚洲欧美| 99xxxx成人网| 久久一区国产| 久久成人亚洲| 天堂av在线| 石原莉奈在线亚洲三区| 国产精品nxnn| 日韩在线观看一区二区| 欧美激情三区| 人人精品人人爱| 欧美久久天堂| 久久国产欧美日韩精品| 9色国产精品| 国产色播av在线| 国产精品第一| 鲁大师影院一区二区三区| 樱桃视频成人在线观看| 国产午夜精品一区在线观看| 欧洲激情综合| 秋霞影视一区二区三区| 亚洲欧美久久精品| 亚洲午夜一级| 日韩国产欧美一区二区| 国产麻豆一区二区三区| 亚洲人成精品久久久| 91国语精品自产拍| 亚洲天堂一区二区| 成人国产精选| 欧美好骚综合网| 精品免费视频| 精品黄色一级片| 国产精品v亚洲精品v日韩精品| 蜜臀久久99精品久久久久久9| 九一国产精品| 99国产精品私拍| 欧美高清不卡| 91久久国产| 在线视频亚洲欧美中文| 视频一区日韩精品| 日本不卡在线视频| 国产色99精品9i| 国产精品久久亚洲不卡| 麻豆精品国产91久久久久久| 麻豆视频一区二区| 97人人精品| 99精品视频在线| 国产日韩综合| 91精品丝袜国产高跟在线| 欧美aa在线视频| 久久精品av| 日韩影院免费视频| 久久av网站| 中文久久精品| 麻豆国产91在线播放| 激情六月综合| 国产精品亚洲综合在线观看| 日韩精品网站| 久久国产麻豆精品| 亚洲高清毛片| 久久国产精品色av免费看| 久久av网站| 香蕉精品久久| 国精品一区二区| 国产精品嫩草99av在线| 日韩激情一区二区| 美女视频网站久久| 美日韩一区二区三区| 精品亚洲美女网站| 免费视频国产一区| 日本一区免费网站| 麻豆一区在线| 国产国产精品| 美女尤物久久精品| 极品裸体白嫩激情啪啪国产精品| 久久精品一区二区不卡| 视频一区二区中文字幕| 91欧美极品| 秋霞国产精品| 91亚洲精品视频在线观看| 日本不良网站在线观看| 亚洲综合欧美| 日本不卡视频一二三区| 国产一区2区| 在线精品一区二区| bbw在线视频| 日本vs亚洲vs韩国一区三区二区| 久久精品国产999大香线蕉| 在线成人动漫av| 国产精品久久久久久久久久齐齐| 波多野结衣一区| 国产成人精选| 欧美视频二区| 丝袜脚交一区二区| 久久婷婷av| 久久精品国产在热久久| 久久成人精品| 精品久久视频| 国产精品亚洲成在人线| 国产一区清纯|