电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

最近在學(xué)習(xí)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設(shè)置為大于0,我當(dāng)時這里配置為0時springboot時啟不起來。

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

//攔截登錄失效的請求public class RedisSessionInterceptor implements HandlerInterceptor{ @Autowired private StringRedisTemplate redisTemplate; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//無論訪問的地址是不是正確的,都進(jìn)行登錄驗證,登錄成功后的訪問再進(jìn)行分發(fā),404的訪問自然會進(jìn)入到錯誤控制器中HttpSession session = request.getSession();if (session.getAttribute('loginUserId') != null){ try {//驗證當(dā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) {//所有已api開頭的訪問都要進(jìn)入RedisSessionInterceptor攔截器進(jìn)行登錄驗證,并排除login接口(全路徑)。必須寫成鏈?zhǔn)剑謩e設(shè)置的話會創(chuàng)建多個攔截器。//必須寫成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實現(xiàn)session共享及唯一登錄示例

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

postman:

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

七、核心原理詳解

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

1、redis:

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

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

同時還要保證配置正確

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

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

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

2、唯一登錄:

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

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

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

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

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

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 团建-拓展-拓展培训-拓展训练-户外拓展训练基地[无锡劲途] | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 苏州西朗门业-欧盟CE|莱茵UL双认证的快速卷帘门品牌厂家 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 点胶机_点胶阀_自动点胶机_智能点胶机_喷胶机_点胶机厂家【欧力克斯】 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 酒万铺-酒水招商-酒水代理| 1000帧高速摄像机|工业高速相机厂家|科天健光电技术 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 礼至家居-全屋定制家具_一站式全屋整装_免费量房设计报价 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | 首页 - 张店继勇软件开发工作室| 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 120kv/2mA直流高压发生器-60kv/2mA-30kva/50kv工频耐压试验装置-旭明电工 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 硫酸钡厂家_高光沉淀硫酸钡价格-河南钡丰化工有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 探鸣起名网-品牌起名-英文商标起名-公司命名-企业取名包满意 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 合肥制氮机_合肥空压机厂家_安徽真空泵-凯圣精机 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 |