色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

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

最近在學(xué)習(xí)springboot,session這個(gè)點(diǎn)一直困擾了我好久,今天把這些天踩的坑分享出來(lái)吧,希望能幫助更多的人。

一、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#超時(shí)一定要大于0spring.redis.timeout=3000spring.session.store-type=redis

在配置redis時(shí)需要確保redis安裝正確,并且配置notify-keyspace-events Egx,spring.redis.timeout設(shè)置為大于0,我當(dāng)時(shí)這里配置為0時(shí)springboot時(shí)啟不起來(lái)。

三、編寫登錄狀態(tài)攔截器RedisSessionInterceptor

//攔截登錄失效的請(qǐng)求public class RedisSessionInterceptor implements HandlerInterceptor{ @Autowired private StringRedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//無(wú)論訪問(wèn)的地址是不是正確的,都進(jìn)行登錄驗(yàn)證,登錄成功后的訪問(wèn)再進(jìn)行分發(fā),404的訪問(wèn)自然會(huì)進(jìn)入到錯(cuò)誤控制器中HttpSession session = request.getSession();if (session.getAttribute('loginUserId') != null){ try {//驗(yàn)證當(dāng)前請(qǐng)求的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) {//所有已a(bǔ)pi開(kāi)頭的訪問(wèn)都要進(jìn)入RedisSessionInterceptor攔截器進(jìn)行登錄驗(yàn)證,并排除login接口(全路徑)。必須寫成鏈?zhǔn)剑謩e設(shè)置的話會(huì)創(chuàng)建多個(gè)攔截器。//必須寫成getSessionInterceptor(),否則SessionInterceptor中的@Autowired會(huì)無(wú)效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, '賬戶名或密碼錯(cuò)誤!');} } @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上登錄相同的賬號(hào),瀏覽器再獲取用戶信息,就會(huì)提示401錯(cuò)誤了,瀏覽器需要重新登錄才能獲取得到用戶信息,同樣,postman上登錄的賬號(hào)就失效了。

瀏覽器:

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

postman:

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

七、核心原理詳解

分布式session需要解決兩個(gè)難點(diǎn):1、正確配置redis讓springboot把session托管到redis服務(wù)器。2、唯一登錄。

1、redis:

redis需要能正確啟動(dòng)到出現(xiàn)如下效果才證明redis正常配置并啟動(dòng)

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

同時(shí)還要保證配置正確

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

springboot啟動(dòng)后能在redis上查到緩存的session才能說(shuō)明整個(gè)redis+springboot配置成功!

SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例

2、唯一登錄:

1、用戶登錄時(shí),在redis中記錄該userId對(duì)應(yīng)的sessionId,并將userId保存到session中。

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

2、訪問(wèn)接口時(shí),會(huì)在RedisSessionInterceptor攔截器中的preHandle()中捕獲,然后根據(jù)該請(qǐng)求發(fā)起者的session中保存的userId去redis查當(dāng)前已登錄的sessionId,若查到的sessionId與訪問(wèn)者的sessionId相等,那么說(shuō)明請(qǐng)求合法,放行。否則拋出401異常給全局異常捕獲器去返回給客戶端401狀態(tài)。

唯一登錄經(jīng)過(guò)我的驗(yàn)證后滿足需求,暫時(shí)沒(méi)有出現(xiàn)問(wèn)題,也希望大家能看看有沒(méi)有問(wèn)題,有的話給我點(diǎn)好的建議!

到此這篇關(guān)于SpringBoot+SpringSession+Redis實(shí)現(xiàn)session共享及唯一登錄示例的文章就介紹到這了,更多相關(guān)SpringBoot 唯一登錄內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 久久黄色视屏 | 日本一线一区二区三区免费视频 | 精品视频在线免费播放 | 欧美日韩国产一区二区三区播放 | 福利视频黄 | 国产三级在线观看 | 成人午夜两性视频免费看 | 精品一区二区三区视频在线观看 | 91av小视频| 久久综合本色宗合一本色 | 性xxxx奶大欧美高清 | 成年人性网站 | 国产精品综合久成人 | 国产午夜爽爽窝窝在线观看 | 香港经典毛片a免费观看 | 免费一级大毛片a一观看不卡 | 国产精品久久久久久久久久久不卡 | 成人做爰视频www片 成人做爰视频www视频 | 久久91精品国产91久久 | 精品a视频 | 成年人视频免费网站 | 黄网站色视频免费观看w | 中文字幕一区日韩在线视频 | 中文字幕色站 | 欧美国产日韩久久久 | 欧美成人精品一级高清片 | 亚洲美女在线观看亚洲美女 | 欧美高清视频手机在在线 | 中文字幕咪咪网 | 午夜怡红院 | 欧美在线高清 | 女人张开腿让男人桶视频免费大全 | 69视频在线观看xxxxx | 亚洲1314 | 亚洲国产日韩欧美一区二区三区 | 国产dvd毛片在线视频 | 怡红院亚洲红怡院天堂麻豆 | 久久久久久免费观看 | hd欧美xxx欧美极品hd | 美女黄色免费在线观看 | 亚洲欧美一二三区 |