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

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

SpringBoot整合SSO(single sign on)單點登錄

瀏覽:19日期:2023-05-10 17:35:11

1、單點登錄三種常見的方式

(1)Session廣播機制(Session復制)(2)使用Cookie+Redis實現(3)使用token實現

SpringBoot整合SSO(single sign on)單點登錄

2、單點登錄介紹

SpringBoot整合SSO(single sign on)單點登錄

SpringBoot整合SSO(single sign on)單點登錄

SpringBoot整合SSO(single sign on)單點登錄

SpringBoot整合SSO(single sign on)單點登錄

舉例:

SpringBoot整合SSO(single sign on)單點登錄

(1)引入jwt依賴

<!-- JWT--><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId></dependency>

(2)創建JWTUtils工具類

public class JwtUtils { //token過期時間 public static final long EXPIRE = 1000 * 60 * 60 * 24; //秘鑰 public static final String APP_SECRET = 'ukc8BDbRigUDaY6pZFfWus2jZWLPHO'; public static String getJwtToken(String id, String nickname){ String JwtToken = Jwts.builder() //設置頭信息 .setHeaderParam('typ', 'JWT') .setHeaderParam('alg', 'HS256') .setSubject('user') .setIssuedAt(new Date()) //設置過期時間 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //設置token主體部分(這里使用id和nickname作為主體部分) .claim('id', id) .claim('nickname', nickname) //加密方式 .signWith(SignatureAlgorithm.HS256, APP_SECRET) .compact(); return JwtToken; } /** * 判斷token是否存在與有效(直接通過APP_SECRET解析token) * @param jwtToken * @return */ public static boolean checkToken(String jwtToken) { if(StringUtils.isEmpty(jwtToken)) return false; try { Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 判斷token是否存在與有效(通過獲取請求頭信息獲取token再使用APP_SECRET解析token) * @param request * @return */ public static boolean checkToken(HttpServletRequest request) { try { String jwtToken = request.getHeader('token'); if(StringUtils.isEmpty(jwtToken)) return false; Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 根據token字符串獲取用戶id(取出有效載荷中的用戶信息) * @param request * @return */ public static String getMemberIdByJwtToken(HttpServletRequest request) { String jwtToken = request.getHeader('token'); if(StringUtils.isEmpty(jwtToken)) return ''; Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); Claims claims = claimsJws.getBody(); return (String)claims.get('id'); }}

3、單點登錄實現

項目目錄結構

SpringBoot整合SSO(single sign on)單點登錄

UcenterMemberController

@RestController@RequestMapping('/user/')@CrossOriginpublic class UcenterMemberController { @Autowired private UcenterMemberService ucenterMemberService;//登錄 @PostMapping('login') public ResponseResult login(@RequestBody MobileLoginRequest request) { String token = ucenterMemberService.login(request); return ResponseResult.success().data('token', token); }//注冊 @PostMapping('register') public ResponseResult register(@RequestBody RegisterRequest request) { ucenterMemberService.register(request); return ResponseResult.success().message('注冊成功'); }//根據token獲取用戶信息 @GetMapping('getUserInfo') public ResponseResult getUserInfo(HttpServletRequest request) { //調用jwt工具類的方法,根據request對象獲取頭信息,返回用戶id String id = JwtUtils.getMemberIdByJwtToken(request); //根據用戶id查詢用戶 UcenterMember member = ucenterMemberService.getById(id); return ResponseResult.success().data('userInfo', member); }}

ServiceImpl

@Servicepublic class UcenterMemberServiceImpl extends ServiceImpl<UcenterMemberMapper, UcenterMember> implements UcenterMemberService { @Autowired private StringRedisTemplate redisTemplate;//登錄 @Override public String login(MobileLoginRequest request) { String phone = request.getPhone(); String password = request.getPassword(); if (StrUtil.isBlank(phone) || StrUtil.isBlank(password)) { throw new GuliException(200001, '請輸入用戶名或者密碼'); } //根據輸入的手機號碼查找該用戶信息 UcenterMember ucenterByPhone = this.baseMapper.selectOne(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone)); if (ucenterByPhone == null) { throw new GuliException(200002, '該用戶名不存在'); } //如果用戶存在比對數據庫密碼和用戶輸入的密碼 if (!MD5Util.encrypt(password).equals(ucenterByPhone.getPassword())) { throw new GuliException(200003, '密碼輸入錯誤'); } String token = JwtUtils.getJwtToken(ucenterByPhone.getId(), ucenterByPhone.getNickname()); return token; }//注冊 @Override public void register(RegisterRequest request) { String phone = request.getPhone(); String password = request.getPassword(); String nickName = request.getNickName(); String code = request.getCode(); if (StrUtil.isBlank(phone) || StrUtil.isBlank(password) || StrUtil.isBlank(nickName) || StrUtil.isBlank(code)) { throw new GuliException(200001, '請填寫相關信息'); } //判斷手機號是否重復 Integer count = baseMapper.selectCount(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone)); if (count > 0) { throw new GuliException(200001, '賬號已經存在請重新輸入'); } //驗證code String redisCode = redisTemplate.opsForValue().get(phone); if (StrUtil.isBlank(redisCode)) { throw new GuliException(200001, '驗證碼已經過期,請重新獲取'); } if (!redisCode.equals(code)) { throw new GuliException(200001, '驗證碼錯誤'); } UcenterMember ucenterByPhone = new UcenterMember(); ucenterByPhone.setMobile(phone); ucenterByPhone.setPassword(MD5Util.encrypt(password)); ucenterByPhone.setNickname(nickName); ucenterByPhone.setIsDisabled(false); int insert = baseMapper.insert(ucenterByPhone); if(insert<=0){ throw new GuliException(20001,'注冊失敗'); } }}

MD5加密算法工具類

public final class MD5Util { public static String encrypt(String strSrc) { try { char hexChars[] = {’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’a’, ’b’, ’c’, ’d’, ’e’, ’f’}; byte[] bytes = strSrc.getBytes(); MessageDigest md = MessageDigest.getInstance('MD5'); md.update(bytes); bytes = md.digest(); int j = bytes.length; char[] chars = new char[j * 2]; int k = 0; for (int i = 0; i < bytes.length; i++) { byte b = bytes[i]; chars[k++] = hexChars[b >>> 4 & 0xf]; chars[k++] = hexChars[b & 0xf]; } return new String(chars); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); throw new RuntimeException('MD5加密出錯!!+' + e); } } public static void main(String[] args) { System.out.println(MD5Util.encrypt('111111')); }}

4、登錄完成后在前端界面展示用戶信息

SpringBoot整合SSO(single sign on)單點登錄

(1)第一、二、四步:登錄的方法(記得npm install js-cookie)

//登錄的方法 submitLogin() { //第一步 調用接口進行登錄,返回token字符串 loginApi.submitLoginUser(this.user) .then(response => { //第二步 獲取token字符串放到cookie里面 //第一個參數cookie名稱,第二個參數值,第三個參數作用范圍 cookie.set(’user_token’,response.data.data.token,{domain: ’localhost’})//第四步 調用接口 根據token獲取用戶信息,為了首頁面顯示 loginApi.getLoginUserInfo() .then(response => { this.loginInfo = response.data.data.userInfo //獲取返回用戶信息,放到cookie里面(主頁在cookie中獲取用戶信息進行展示) cookie.set(’user_info’,this.loginInfo,{domain: ’localhost’}) //跳轉頁面 window.location.href = 'http://www.b3g6.com/'; }) }) },

(2)第三步:在request.js中編寫前端請求攔截器(發送請求攜帶token)

// 創建axios實例const service = axios.create({ baseURL: process.env.BASE_API, // api 的 base_url timeout: 5000 // 請求超時時間})// request攔截器service.interceptors.request.use( config => { if (cookie.get(’user_token’)) { config.headers[’token’] = cookie.get(’user_token’) // 讓每個請求攜帶自定義token 請根據實際情況自行修改 } return config }, error => { // Do something with request error console.log(error) // for debug Promise.reject(error) })

(3)第五步:主頁顯示用戶信息(從cookie中獲取用戶信息)

//創建方法,從cookie獲取用戶信息showInfo() { //從cookie獲取用戶信息 var userStr = cookie.get(’guli_ucenter’) // 把字符串轉換json對象(js對象),因為后端傳過來的是'{’name’,’lucy’,’age’:18}'的格式 if(userStr) { this.loginInfo = JSON.parse(userStr) }}

顯示用戶信息(根據userInfo中id來判斷)

<ul class='h-r-login'> //cookie中沒有用戶信息,顯示登錄和注冊 <li v-if='!loginInfo.id' id='no-login'> <a href='http://www.b3g6.com/login' rel='external nofollow'> <em class='icon18 login-icon'>&nbsp;</em> <span class='vam ml5'>登錄</span> </a> | <a href='http://www.b3g6.com/register' rel='external nofollow'> <span class='vam ml5'>注冊</span> </a> </li> //cookie中有用戶信息,顯示用戶頭像、昵稱和退出 <li v-if='loginInfo.id' class='h-r-user'> <a href='http://www.b3g6.com/ucenter' rel='external nofollow' title> <img :src='http://www.b3g6.com/bcjs/loginInfo.avatar' alt > <span class='vam disIb'>{{ loginInfo.nickname }}</span> </a> <a href='javascript:void(0);' rel='external nofollow' @click='logout()' class='ml5'>退出</a> </li></ul>

退出登錄,清空cookie中的token和用戶信息

//退出 logout() { //清空cookie值 cookie.set(’user_token’,’’,{domain: ’localhost’}) cookie.set(’user_info’,’’,{domain: ’localhost’}) //回到首頁面 window.location.href = 'http://www.b3g6.com/'; } }

到此這篇關于SpringBoot整合SSO(single sign on)單點登錄的文章就介紹到這了,更多相關SpringBoot整合SSO單點登錄內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久99视频只有精品| 亚洲成人国产| 三级欧美在线一区| 99riav1国产精品视频| 99国产精品免费视频观看| 日韩三区在线| 日韩精品永久网址| 久久精品国产99久久| av一区二区高清| 亚洲欧美日韩国产一区二区| 亚洲精品国产日韩| 久久的色偷偷| 国产成人免费精品| 欧美日韩国产在线观看网站| 久久先锋影音| 国产精品第一国产精品| 欧美日韩尤物久久| 中文字幕中文字幕精品| 国产精品美女午夜爽爽| 九九色在线视频| 国产亚洲精品久久久久婷婷瑜伽| 亚洲在线成人| 日韩精品亚洲专区| 国产一区二区三区91| 麻豆精品蜜桃| 日本成人在线网站| 裤袜国产欧美精品一区| 野花国产精品入口| 欧美1区二区| 在线日韩av| 国产福利一区二区三区在线播放| 亚洲a一区二区三区| 亚洲bt欧美bt精品777| 久久亚洲黄色| 日韩三级久久| 波多野结衣一区| 亚洲九九精品| 99精品国产一区二区三区| 日韩高清电影免费| 国产亚洲精品v| 美女福利一区二区三区| 日韩1区2区3区| 久久一区二区三区喷水| 国产精品午夜av| 免费久久精品| 成午夜精品一区二区三区软件| 视频一区视频二区在线观看| 国产一区二区三区亚洲综合| 中文字幕视频精品一区二区三区| 亚洲伊人av| 国产精品色在线网站| 激情欧美一区| 成人午夜在线| 国产精品极品国产中出| 亚洲精品影院在线观看| 日韩精品影视| 国产一区二区三区视频在线| 亚洲97av| 最新国产精品| 男人的天堂亚洲一区| 婷婷成人在线| 深夜视频一区二区| 四虎8848精品成人免费网站| 国产精品极品国产中出| 日韩av在线播放中文字幕| 久久亚洲国产精品一区二区| 亚洲成av在线| 国产综合色区在线观看| av在线最新| 久久人人精品| 91成人精品| 国内精品福利| 亚洲男女av一区二区| 蜜桃av一区二区在线观看| 视频一区中文字幕国产| 亚洲精品伊人| 国产精品久久| 久久久久黄色| 日韩欧美中文| 久久精品青草| 亚洲自啪免费| 免费在线视频一区| 亚洲精品在线a| 国产精品免费不| 国产成人久久精品一区二区三区| 粉嫩av一区二区三区四区五区 | 亚洲精品在线二区| 日韩高清不卡一区| 国产三级精品三级在线观看国产| 亚洲精选91| 久久精品国产亚洲一区二区三区| 日韩国产欧美一区二区| 一本一道久久a久久精品蜜桃| 亚洲视频二区| 久久精品国产免费| 黄色精品网站| 捆绑调教美女网站视频一区| 午夜久久黄色| 国产精品片aa在线观看| 伊人久久av| 日韩欧美在线精品| 91欧美在线| 日本不卡中文字幕| 激情久久婷婷| 日韩高清不卡一区二区| 精品伊人久久久| 99视频一区| 国产精品久久亚洲不卡| 中文字幕在线免费观看视频| 日韩精品欧美大片| 蜜桃国内精品久久久久软件9| 欧美久久香蕉| 中日韩男男gay无套| 国内精品美女在线观看| 日韩久久99| 在线一区电影| 国产中文字幕一区二区三区| 视频精品一区二区| 电影天堂国产精品| 91精品啪在线观看国产爱臀| 91精品一区二区三区综合在线爱| 久久精品凹凸全集| 亚洲视频国产精品| 香蕉国产精品| 91亚洲国产成人久久精品| 久久国产三级| 亚洲精品中文字幕99999| 99精品国产一区二区三区| 精品成人18| 精品三级av| 国产精品亚洲综合久久| 日本一区中文字幕| 视频一区国产视频| 男人的天堂亚洲一区| 色综合www| 精品精品久久| 精品国产三区在线| 成人国产精品一区二区免费麻豆| 国产精品s色| 国产精品一区二区中文字幕| 日韩精品一区二区三区中文| 亚洲人成亚洲精品| 日韩一区二区三区精品| 亚洲精品精选| 国产日韩欧美中文在线| 国产精品免费大片| 九九久久国产| 亚洲美女久久精品| 999国产精品| 欧美二区视频| 天堂成人免费av电影一区| 男女男精品网站| 日韩黄色av| 国语精品一区| 欧美高清一区| 亚洲人妖在线| 美女av一区| 神马午夜久久| 一区二区三区国产盗摄| 国产亚洲人成a在线v网站| 欧美国产偷国产精品三区| 黄色av一区| 国产麻豆精品久久| 日本亚洲最大的色成网站www| 免费不卡在线观看| 日韩精品乱码av一区二区| 涩涩涩久久久成人精品| 国产精品观看| 国产亚洲一区| 在线亚洲一区| 亚洲97av| 国产精品hd| 精品中国亚洲| 精品日韩一区| 手机在线电影一区| 精品亚洲免a| 日韩国产一区二区三区| 午夜av不卡| 在线日韩一区| 日韩在线观看| 欧美理论视频| 天堂久久av| 亚洲男女自偷自拍| 99国产精品视频免费观看一公开| 天堂网av成人| 免费日韩一区二区| 欧美日一区二区| 亚洲免费一区二区| 日本一区福利在线| 久久精品系列| 国产传媒在线观看| 日韩电影在线视频| 久久激情婷婷| 蜜桃av一区| 亚洲精品美女| 免费一区二区三区在线视频| 久久影院资源站| 久久久一二三| 日韩影院免费视频| 老司机精品久久|