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

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

Springboot中登錄后關于cookie和session攔截問題的案例分析

瀏覽:5日期:2023-04-30 18:55:09

一、前言

1、簡單的登錄驗證可以通過Session或者Cookie實現。2、每次登錄的時候都要進數據庫校驗下賬戶名和密碼,只是加了cookie 或session驗證后;比如登錄頁面A,登錄成功后進入頁面B,若此時cookie過期,在頁面B中新的請求url到頁面c,系統會讓它回到初始的登錄頁面。(類似單點登錄sso(single sign on))。3、另外,無論基于Session還是Cookie的登錄驗證,都需要對HandlerInteceptor進行配置,增加對URL的攔截過濾機制。

二、利用Cookie進行登錄驗證

1、配置攔截器代碼如下:

public class CookiendSessionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.debug('進入攔截器'); Cookie[] cookies = request.getCookies(); if(cookies!=null && cookies.length>0){ for(Cookie cookie:cookies) { log.debug('cookie===for遍歷'+cookie.getName()); if (StringUtils.equalsIgnoreCase(cookie.getName(), 'isLogin')) { log.debug('有cookie ---isLogin,并且cookie還沒過期...'); //遍歷cookie如果找到登錄狀態則返回true繼續執行原來請求url到controller中的方法 return true; } }} log.debug('沒有cookie-----cookie時間可能到期,重定向到登錄頁面后請重新登錄。。。'); response.sendRedirect('index.html'); //返回false,不執行原來controller的方法 return false; } @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 { } }

2、在Springboot中攔截的請求不管是配置監聽器(定義一個類實現一個接口HttpSessionListener )、過濾器、攔截器,都要配置如下此類實現一個接口中的兩個方法。代碼如下:

@Configuration public class WebConfig implements WebMvcConfigurer { // 這個方法是用來配置靜態資源的,比如html,js,css,等等 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { } // 這個方法用來注冊攔截器,我們自己寫好的攔截器需要通過這里添加注冊才能生效 @Override public void addInterceptors(InterceptorRegistry registry) { //addPathPatterns('/**') 表示攔截所有的請求 //excludePathPatterns('/firstLogin','/zhuce');設置白名單,就是攔截器不攔截。首次輸入賬號密碼登錄和注冊不用攔截! //登錄頁面在攔截器配置中配置的是排除路徑,可以看到即使放行了,還是會進入prehandle,但是不會執行任何操作。 registry.addInterceptor(new CookiendSessionInterceptor()).addPathPatterns('/**').excludePathPatterns('/', '/**/login', '/**/*.html', '/**/*.js', '/**/*.css', '/**/*.jpg'); } }

3.前臺登錄頁面index.html(我把這個html放在靜態資源了,也讓攔截器放行了此路由url)前端測試就是一個簡單的form表單提交

<!--測試cookie和sessionid--> <form action='/login' method='post'> 賬號:<input type='text' name='name1' placeholder='請輸入賬號'><br> 密碼:<input type='password' name='pass1' placeholder='請輸入密碼'><br> <input type='submit' value='登錄'> </form>

4、后臺控制層Controller業務邏輯:登錄頁面index.html,登錄成功后 loginSuccess.html。在loginSuccess.html中可提交表單進入次頁demo.html,也可點擊“退出登錄”后臺清除沒有超時的cookie,并且回到初始登錄頁面。

@Controller @Slf4j @RequestMapping(value = '/') public class TestCookieAndSessionController { @Autowired JdbcTemplate jdbcTemplate; /** * 首次登錄,輸入賬號和密碼,數據庫驗證無誤后,響應返回你設置的cookie。再次輸入賬號密碼登錄或者首次登錄后再請求下一個頁面,就會在請求頭中攜帶cookie, * 前提是cookie沒有過期。 * 此url請求方法不管是首次登錄還是第n次登錄,攔截器都不會攔截。 * 但是每次(首次或者第N次)登錄都要進行,數據庫查詢驗證賬號和密碼。 * 做這個目的是如果登錄頁面A,登錄成功后進頁面B,頁面B有鏈接進頁面C,如果cookie超時,重新回到登錄頁面A。(類似單點登錄) */ @PostMapping(value = 'login') public String test(HttpServletRequest request, HttpServletResponse response, @RequestParam('name1')String name,@RequestParam('pass1')String pass) throws Exception{ try { Map<String, Object> result= jdbcTemplate.queryForMap('select * from userinfo where name=? and password=?', new Object[]{name, pass}); if(result==null || result.size()==0){log.debug('賬號或者密碼不正確或者此人賬號沒有注冊');throw new Exception('賬號或者密碼不正確或者此人賬號沒有注冊!'); }else{log.debug('查詢滿足條數----'+result);Cookie cookie = new Cookie('isLogin', 'success');cookie.setMaxAge(30);cookie.setPath('/'); response.addCookie(cookie);request.setAttribute('isLogin', name);log.debug('首次登錄,查詢數據庫用戶名和密碼無誤,登錄成功,設置cookie成功');return 'loginSuccess'; } } catch (DataAccessException e) { e.printStackTrace(); return 'error1'; } } /**測試登錄成功后頁面loginSuccess ,進入次頁demo.html*/ @PostMapping(value = 'sub') public String test() throws Exception{ return 'demo'; } /** 能進到此方法中,cookie一定沒有過期。因為攔截器在前面已經判斷力。過期,攔截器重定向到登錄頁面。過期退出登錄,清空cookie。*/ @RequestMapping(value = 'exit',method = RequestMethod.POST) public String exit(HttpServletRequest request,HttpServletResponse response) throws Exception{ Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies){ if('isLogin'.equalsIgnoreCase(cookie.getName())){ log.debug('退出登錄時,cookie還沒過期,清空cookie'); cookie.setMaxAge(0); cookie.setValue(null); cookie.setPath('/'); response.addCookie(cookie); break; } } //重定向到登錄頁面 return 'redirect:index.html'; } }

5、效果演示:①在登錄“localhost:8082”輸入賬號登錄頁面登錄:

Springboot中登錄后關于cookie和session攔截問題的案例分析

②攔截器我設置了放行/login,所以請求直接進Controller相應的方法中:日志信息如下:

Springboot中登錄后關于cookie和session攔截問題的案例分析

下圖可以看出,瀏覽器有些自帶的不止一個cookie,這里不要管它們。

Springboot中登錄后關于cookie和session攔截問題的案例分析

③在loginSuccess.html,進入次頁demo.html。cookie沒有過期順利進入demo.html,并且/sub方法經過攔截器(此請求請求頭中攜帶cookie)。過期的話直接回到登錄頁面(這里不展示了)

Springboot中登錄后關于cookie和session攔截問題的案例分析

④在loginSuccess.html點擊“退出登錄”,后臺清除我設置的沒過期的cookie=isLogin,回到登錄頁面。

三、利用Session進行登錄驗證

1、修改攔截器配置略微修改下:

Springboot中登錄后關于cookie和session攔截問題的案例分析

Interceptor也略微修改下:還是上面的preHandle方法中:

Springboot中登錄后關于cookie和session攔截問題的案例分析

2.核心前端我就不展示了,就是一個form表單action='login1'后臺代碼如下:

/**利用session進行登錄驗證*/ @RequestMapping(value = 'login1',method = RequestMethod.POST) public String testSession(HttpServletRequest request, HttpServletResponse response, @RequestParam('name1')String name, @RequestParam('pass1')String pass) throws Exception{ try { Map<String, Object> result= jdbcTemplate.queryForMap('select * from userinfo where name=? and password=?', new Object[]{name, pass}); if(result!=null && result.size()>0){ String requestURI = request.getRequestURI(); log.debug('此次請求的url:{}',requestURI); HttpSession session = request.getSession(); log.debug('session='+session+'session.getId()='+session.getId()+'session.getMaxInactiveInterval()='+session.getMaxInactiveInterval()); session.setAttribute('isLogin1', 'true1'); } } catch (DataAccessException e) { e.printStackTrace(); return 'error1'; } return 'loginSuccess'; } //登出,移除登錄狀態并重定向的登錄頁 @RequestMapping(value = '/exit1', method = RequestMethod.POST) public String loginOut(HttpServletRequest request) { request.getSession().removeAttribute('isLogin1'); log.debug('進入exit1方法,移除isLogin1'); return 'redirect:index.html'; } }

日志如下:可以看見springboot內置的tomcat中sessionid就是請求頭中的jsessionid,而且默認時間1800秒(30分鐘)。我也不清楚什么進入攔截器2次,因為我login1設置放行了,肯定不會進入攔截器。可能是什么靜態別的什么資源吧。

Springboot中登錄后關于cookie和session攔截問題的案例分析

session.getId()=F88CF6850CD575DFB3560C3AA7BEC89F==下圖的JSESSIONID

Springboot中登錄后關于cookie和session攔截問題的案例分析

//點擊退出登錄,請求退出url的請求頭還是攜帶JSESSIONID,除非瀏覽器關掉才消失。(該session設置的屬性isLogin1移除了,session在不關瀏覽器情況下或者超過默認時間30分鐘后,session才會自動清除!)

Springboot中登錄后關于cookie和session攔截問題的案例分析

Springboot中登錄后關于cookie和session攔截問題的案例分析

四、完結

到此這篇關于Springboot中登錄后關于cookie和session攔截案例的文章就介紹到這了,更多相關Springboot登錄關于cookie和session攔截內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 江西高职单独招生-江西单招考试-江西高职单招网| 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | 机床导轨_导轨板_滚轮导轨-上海旻佑精密机械有限公司 | 耐压仪-高压耐压仪|徐吉电气 | 三佳互联一站式网站建设服务|网站开发|网站设计|网站搭建服务商 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 小小作文网_中小学优秀作文范文大全 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | 深圳货架厂_仓库货架公司_重型仓储货架_线棒货架批发-深圳市诺普泰仓储设备有限公司 | 不锈钢拉手厂家|浴室门拉手厂家|江门市蓬江区金志翔五金制品有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 耐高温电缆厂家-远洋高温电缆 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 烟台游艇培训,威海游艇培训-烟台市邮轮游艇行业协会 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | FFU_空气初效|中效|高效过滤器_空调过滤网-广州梓净净化设备有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 北京中航时代-耐电压击穿试验仪厂家-电压击穿试验机 | 无痕胶_可移胶_无痕双面胶带_可移无痕胶厂家-东莞凯峰 | 达利园物流科技集团- | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 济南律师,济南法律咨询,山东法律顾问-山东沃德律师事务所 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 手术示教系统-数字化手术室系统-林之硕医疗云智能视频平台 | 泰安办公家具-泰安派格办公用品有限公司 | 建筑资质代办-建筑企业资质代办机构-建筑资质代办公司 |