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

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

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

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

1、單點(diǎn)登錄三種常見的方式

(1)Session廣播機(jī)制(Session復(fù)制)(2)使用Cookie+Redis實(shí)現(xiàn)(3)使用token實(shí)現(xiàn)

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

2、單點(diǎn)登錄介紹

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

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

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

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

舉例:

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

(1)引入jwt依賴

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

(2)創(chuàng)建JWTUtils工具類

public class JwtUtils { //token過期時(shí)間 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() //設(shè)置頭信息 .setHeaderParam('typ', 'JWT') .setHeaderParam('alg', 'HS256') .setSubject('user') .setIssuedAt(new Date()) //設(shè)置過期時(shí)間 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //設(shè)置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是否存在與有效(通過獲取請(qǐng)求頭信息獲取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; } /** * 根據(jù)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、單點(diǎn)登錄實(shí)現(xiàn)

項(xiàng)目目錄結(jié)構(gòu)

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

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); }//注冊(cè) @PostMapping('register') public ResponseResult register(@RequestBody RegisterRequest request) { ucenterMemberService.register(request); return ResponseResult.success().message('注冊(cè)成功'); }//根據(jù)token獲取用戶信息 @GetMapping('getUserInfo') public ResponseResult getUserInfo(HttpServletRequest request) { //調(diào)用jwt工具類的方法,根據(jù)request對(duì)象獲取頭信息,返回用戶id String id = JwtUtils.getMemberIdByJwtToken(request); //根據(jù)用戶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, '請(qǐng)輸入用戶名或者密碼'); } //根據(jù)輸入的手機(jī)號(hào)碼查找該用戶信息 UcenterMember ucenterByPhone = this.baseMapper.selectOne(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone)); if (ucenterByPhone == null) { throw new GuliException(200002, '該用戶名不存在'); } //如果用戶存在比對(duì)數(shù)據(jù)庫(kù)密碼和用戶輸入的密碼 if (!MD5Util.encrypt(password).equals(ucenterByPhone.getPassword())) { throw new GuliException(200003, '密碼輸入錯(cuò)誤'); } String token = JwtUtils.getJwtToken(ucenterByPhone.getId(), ucenterByPhone.getNickname()); return token; }//注冊(cè) @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, '請(qǐng)?zhí)顚懴嚓P(guān)信息'); } //判斷手機(jī)號(hào)是否重復(fù) Integer count = baseMapper.selectCount(new LambdaQueryWrapper<UcenterMember>().eq(UcenterMember::getMobile, phone)); if (count > 0) { throw new GuliException(200001, '賬號(hào)已經(jīng)存在請(qǐng)重新輸入'); } //驗(yàn)證code String redisCode = redisTemplate.opsForValue().get(phone); if (StrUtil.isBlank(redisCode)) { throw new GuliException(200001, '驗(yàn)證碼已經(jīng)過期,請(qǐng)重新獲取'); } if (!redisCode.equals(code)) { throw new GuliException(200001, '驗(yàn)證碼錯(cuò)誤'); } 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,'注冊(cè)失敗'); } }}

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加密出錯(cuò)!!+' + e); } } public static void main(String[] args) { System.out.println(MD5Util.encrypt('111111')); }}

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

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

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

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

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

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

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

//創(chuàng)建方法,從cookie獲取用戶信息showInfo() { //從cookie獲取用戶信息 var userStr = cookie.get(’guli_ucenter’) // 把字符串轉(zhuǎn)換json對(duì)象(js對(duì)象),因?yàn)楹蠖藗鬟^來(lái)的是'{’name’,’lucy’,’age’:18}'的格式 if(userStr) { this.loginInfo = JSON.parse(userStr) }}

顯示用戶信息(根據(jù)userInfo中id來(lái)判斷)

<ul class='h-r-login'> //cookie中沒有用戶信息,顯示登錄和注冊(cè) <li v-if='!loginInfo.id' id='no-login'> <a href='http://m.b3g6.com/login' rel='external nofollow'> <em class='icon18 login-icon'>&nbsp;</em> <span class='vam ml5'>登錄</span> </a> | <a href='http://m.b3g6.com/register' rel='external nofollow'> <span class='vam ml5'>注冊(cè)</span> </a> </li> //cookie中有用戶信息,顯示用戶頭像、昵稱和退出 <li v-if='loginInfo.id' class='h-r-user'> <a href='http://m.b3g6.com/ucenter' rel='external nofollow' title> <img :src='http://m.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’}) //回到首頁(yè)面 window.location.href = 'http://m.b3g6.com/'; } }

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷视频一区二区三区| 欧美午夜三级| 蜜桃av.网站在线观看| 国产一区二区三区日韩精品| 精品在线网站观看| 日韩中文首页| 99国内精品| 婷婷精品在线| 韩国女主播一区二区三区| 久久精品资源| 色爱av综合网| 亚洲日本欧美| 欧美成人精品一级| 日韩一区二区在线免费| 香蕉久久夜色精品国产| 日韩av中文在线观看| 岛国精品一区| 亚洲在线国产日韩欧美| 国产日韩欧美一区二区三区| 在线手机中文字幕| 久久高清国产| 国产精品久久久久久av公交车| 久久电影tv| 在线观看一区| 欧美视频精品全部免费观看| 国产精品久久观看| 久久国产精品99国产| 国产精品乱战久久久| 欧美性感美女一区二区| 日本一区二区三区中文字幕| 国产va在线视频| 最新国产精品| 色黄视频在线观看| 日本欧美大码aⅴ在线播放| 欧美日韩视频免费观看| 日韩精品欧美成人高清一区二区| 欧美日韩视频网站| 日本91福利区| 私拍精品福利视频在线一区| 深夜日韩欧美| 91精品一区二区三区综合| 91麻豆精品激情在线观看最新| 在线精品亚洲欧美日韩国产| 欧美精品国产一区| 免费精品视频| 日韩欧美一区二区三区在线观看| 欧美亚洲tv| 久久午夜影视| 欧美日中文字幕| 精品国产一区二区三区噜噜噜| 久久成人国产| 黑人精品一区| 国产精品美女午夜爽爽| 中文在线日韩| 在线一区电影| 日韩欧美二区| 欧美激情亚洲| 欧美日韩视频免费看| 夜久久久久久| 久久久久久久久久久妇女| 你懂的亚洲视频| 深夜福利亚洲| 亚洲免费黄色| 久久国产日本精品| 日韩a一区二区| 国产精品1luya在线播放| 亚洲人亚洲人色久| 欧美特黄视频| 久久精品免费一区二区三区| 欧美激情一区| 日韩不卡在线观看日韩不卡视频| 免费av一区| 久久久久网站| 国产精品一线天粉嫩av| 综合一区在线| 亚洲精品成a人ⅴ香蕉片| 午夜精品婷婷| 午夜精品久久久久久久久久蜜桃| 欧美成a人片免费观看久久五月天| 日韩一区二区三区精品| 久久福利毛片| 亚洲三级国产| 日韩精品视频网| 欧美天堂在线| 日本欧美一区二区| 日韩精品视频在线看| 日韩激情啪啪| 日韩国产一二三区| 日本欧美一区| 国产亚洲观看| 国产精品极品在线观看| 国产精品久久久亚洲一区| 久久精品97| 国产极品嫩模在线观看91精品| 日本免费一区二区视频| 91精品国产自产精品男人的天堂| 日韩精品国产精品| 青青国产精品| 国产日产精品一区二区三区四区的观看方式 | 欧美三级精品| 一区二区三区四区日本视频| 日韩av自拍| 久久蜜桃精品| 免费久久久久久久久| 国产精品日韩| 亚洲精品国产日韩| 国产丝袜一区| 久久精品毛片| 国产精品蜜芽在线观看| 视频在线不卡免费观看| 精品网站999| 成人台湾亚洲精品一区二区| 麻豆一区二区三| 日韩毛片视频| 午夜av一区| 亚洲乱亚洲高清| 国产情侣久久| 日韩在线中文| 免费日韩视频| 国产精品探花在线观看| 正在播放日韩精品| 国产婷婷精品| 国产精品国产三级在线观看| 欧美久久天堂| 亚洲精品乱码久久久久久蜜桃麻豆 | 精品一区视频| 亚洲精品在线二区| 麻豆精品视频在线观看免费| 久久99蜜桃| 欧美精品高清| 亚洲综合图色| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 福利一区和二区| 久久精品免费一区二区三区 | 久久精品九色| 欧美午夜不卡影院在线观看完整版免费| 综合干狼人综合首页| 国产精品一区高清| 97精品在线| 亚洲精品欧美| 精品国产一区二区三区2021| 亚洲一卡久久| 国产成人免费av一区二区午夜| 在线亚洲免费| 免费一级欧美片在线观看网站| 久久高清免费| 国产精品亚洲欧美日韩一区在线 | 免费日韩成人| 性一交一乱一区二区洋洋av| 老司机免费视频一区二区| 亚洲福利专区| 国产亚洲高清在线观看| 午夜欧美精品久久久久久久| 久久影院资源站| 亚洲区欧美区| 欧美色图一区| 老司机免费视频一区二区| 丝袜脚交一区二区| 日本美女一区| 麻豆精品在线观看| 亚洲最大av| 亚洲精品91| 蜜臀国产一区| 国产日韩亚洲欧美精品| 亚洲欧美日韩在线观看a三区| 国产一区二区三区天码| 亚洲精品乱码| 黄色亚洲精品| 欧美aa在线观看| 嫩呦国产一区二区三区av| 日本亚洲视频在线| 午夜国产精品视频| 九九精品调教| 精品国产精品久久一区免费式 | 亚洲一区亚洲| 香蕉视频亚洲一级| 久久精品天堂| 国产精品欧美三级在线观看| 日韩中文字幕不卡| 欧美精品一区二区三区精品| а√天堂中文在线资源8| 国产精品乱战久久久| 日本午夜精品视频在线观看| 老牛国产精品一区的观看方式| 99久久精品网站| 亚洲性色av| 日韩免费看片| 亚洲天堂av影院| 精品国产亚洲一区二区三区大结局| 欧美一级久久| 日韩va亚洲va欧美va久久| 在线视频免费在线观看一区二区| 日韩精品午夜| 久久精品青草| 国产综合亚洲精品一区二| 久久国产欧美| 亚洲福利免费| 免费视频一区三区| 午夜久久免费观看| 香蕉久久久久久久av网站|