中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

github 建網(wǎng)站行業(yè)網(wǎng)站有哪些平臺(tái)

github 建網(wǎng)站,行業(yè)網(wǎng)站有哪些平臺(tái),小型商城網(wǎng)站,網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì)實(shí)訓(xùn)總結(jié)Redis代替session 實(shí)現(xiàn)登錄流程 如果使用String,他的value,用多占用一點(diǎn)空間,如果使用哈希,則他的value中只會(huì)存儲(chǔ)他數(shù)據(jù)本身,如果不是特別在意內(nèi)存,其實(shí)使用String就可以 設(shè)計(jì)key的具體細(xì)節(jié) 在設(shè)計(jì)這個(gè)k…

Redis代替session 實(shí)現(xiàn)登錄流程

????????如果使用String,他的value,用多占用一點(diǎn)空間,如果使用哈希,則他的value中只會(huì)存儲(chǔ)他數(shù)據(jù)本身,如果不是特別在意內(nèi)存,其實(shí)使用String就可以

設(shè)計(jì)key的具體細(xì)節(jié)

在設(shè)計(jì)這個(gè)key的時(shí)候,我們之前講過(guò)需要滿足兩點(diǎn)

  1. key要具有唯一性
  2. key要方便攜帶

????????如果我們采用phone:手機(jī)號(hào)這個(gè)的數(shù)據(jù)來(lái)存儲(chǔ)當(dāng)然是可以的,但是如果把這樣的敏感數(shù)據(jù)存儲(chǔ)到redis中并且從頁(yè)面中帶過(guò)來(lái)畢竟不太合適,所以我們?cè)?span style="color:#fe2c24;">后臺(tái)生成一個(gè)隨機(jī)串token,然后讓前端帶來(lái)這個(gè)token就能完成我們的整體邏輯了

整體訪問(wèn)流程

????????當(dāng)注冊(cè)完成后,用戶去登錄會(huì)去校驗(yàn)用戶提交的手機(jī)號(hào)和驗(yàn)證碼,是否一致,如果一致,則根據(jù)手機(jī)號(hào)查詢(xún)用戶信息,不存在則新建,最后將用戶數(shù)據(jù)保存到redis,并且生成token作為redis的key,當(dāng)我們校驗(yàn)用戶是否登錄時(shí),會(huì)去攜帶著token進(jìn)行訪問(wèn),從redis中取出token對(duì)應(yīng)的value,判斷是否存在這個(gè)數(shù)據(jù),如果沒(méi)有則攔截,如果存在則將其保存到threadLocal中,并且放行。

基于Redis實(shí)現(xiàn)短信登錄

UserServiceImpl代碼


//    public static final String LOGIN_CODE_KEY = "login:code:";
@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {// 1.校驗(yàn)手機(jī)號(hào)String phone = loginForm.getPhone();if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合,返回錯(cuò)誤信息return Result.fail("手機(jī)號(hào)格式錯(cuò)誤!");}// 3.從redis獲取驗(yàn)證碼并校驗(yàn)String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);String code = loginForm.getCode();if (cacheCode == null || !cacheCode.equals(code)) {// 不一致,報(bào)錯(cuò)return Result.fail("驗(yàn)證碼錯(cuò)誤");}// 4.一致,根據(jù)手機(jī)號(hào)查詢(xún)用戶 select * from tb_user where phone = ?User user = query().eq("phone", phone).one();// 5.判斷用戶是否存在if (user == null) {// 6.不存在,創(chuàng)建新用戶并保存user = createUserWithPhone(phone);}// 7.保存用戶信息到 redis中// 7.1.隨機(jī)生成token,作為登錄令牌String token = UUID.randomUUID().toString(true);// 7.2.將User對(duì)象轉(zhuǎn)為HashMap存儲(chǔ)UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));// 7.3.存儲(chǔ)String tokenKey = LOGIN_USER_KEY + token;stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);// 7.4.設(shè)置token有效期stringRedisTemplate.expire(tokenKey, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.返回tokenreturn Result.ok(token);
}

解決狀態(tài)登錄刷新問(wèn)題

????????在這個(gè)方案中,他確實(shí)可以使用對(duì)應(yīng)路徑的攔截,同時(shí)刷新登錄token令牌的存活時(shí)間,但是現(xiàn)在這個(gè)攔截器他只是攔截需要被攔截的路徑,假設(shè)當(dāng)前用戶訪問(wèn)了一些不需要攔截的路徑,那么這個(gè)攔截器就不會(huì)生效,所以此時(shí)令牌刷新的動(dòng)作實(shí)際上就不會(huì)執(zhí)行,所以這個(gè)方案他是存在問(wèn)題的

????????既然之前的攔截器無(wú)法對(duì)不需要攔截的路徑生效,那么我們可以添加一個(gè)攔截器,在第一個(gè)攔截器中攔截所有的路徑,把第二個(gè)攔截器做的事情放入到第一個(gè)攔截器中,同時(shí)刷新令牌,因?yàn)榈谝粋€(gè)攔截器有了threadLocal的數(shù)據(jù),所以此時(shí)第二個(gè)攔截器只需要判斷攔截器中的user對(duì)象是否存在即可,完成整體刷新功能。

RefreshTokenInterceptor

public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.獲取請(qǐng)求頭中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}// 2.基于TOKEN獲取redis中的用戶String key  = LOGIN_USER_KEY + token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);// 3.判斷用戶是否存在if (userMap.isEmpty()) {return true;}// 5.將查詢(xún)到的hash數(shù)據(jù)轉(zhuǎn)為UserDTOUserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);// 6.存在,保存用戶信息到 ThreadLocalUserHolder.saveUser(userDTO);// 7.刷新token有效期stringRedisTemplate.expire(key, LOGIN_USER_TTL, TimeUnit.MINUTES);// 8.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用戶UserHolder.removeUser();}
}

LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.判斷是否需要攔截(ThreadLocal中是否有用戶)if (UserHolder.getUser() == null) {// 沒(méi)有,需要攔截,設(shè)置狀態(tài)碼response.setStatus(401);// 攔截return false;}// 有用戶,則放行return true;}
}

http://www.risenshineclean.com/news/66217.html

相關(guān)文章:

  • 網(wǎng)站怎么做播放器促銷(xiāo)活動(dòng)推廣語(yǔ)言
  • 設(shè)計(jì)素材網(wǎng)站源碼seo谷歌外貿(mào)推廣
  • 自己的簡(jiǎn)歷網(wǎng)站怎么做百度收錄查詢(xún)工具官網(wǎng)
  • 做網(wǎng)站建設(shè)的電話銷(xiāo)售免費(fèi)建立網(wǎng)站
  • 網(wǎng)站服務(wù)器要多少錢(qián)南寧推廣軟件
  • 做電氣設(shè)計(jì)有哪些好的網(wǎng)站四川省人民政府官網(wǎng)
  • 網(wǎng)站首頁(yè)不被收錄上海廣告公司
  • 香港公司能在國(guó)內(nèi)做網(wǎng)站個(gè)人免費(fèi)網(wǎng)上注冊(cè)公司
  • 企業(yè)網(wǎng)站的建設(shè)流程南昌seo數(shù)據(jù)監(jiān)控
  • 帝國(guó)cms怎么做網(wǎng)站谷歌ads
  • 電腦哪里做模板下載網(wǎng)站查找關(guān)鍵詞的工具叫什么
  • 德陽(yáng)市住房和城鄉(xiāng)建設(shè)局網(wǎng)站首頁(yè)網(wǎng)站推廣上首頁(yè)
  • 做網(wǎng)站的不給源文件搜索引擎網(wǎng)站
  • 網(wǎng)站備案到公司搜狗搜索網(wǎng)
  • wordpress將用戶鎖在前臺(tái)seo如何優(yōu)化網(wǎng)站
  • 網(wǎng)站建設(shè)需求分析報(bào)告seo搜索引擎優(yōu)化推廣專(zhuān)員
  • 淘客網(wǎng)站模版泉州seo培訓(xùn)
  • 哪個(gè)網(wǎng)站可以做信用社的題百度宣傳廣告要多少錢(qián)
  • 網(wǎng)站建設(shè)所需知識(shí)網(wǎng)絡(luò)推廣軟文怎么寫(xiě)
  • 58同城做網(wǎng)站要錢(qián)嗎南京網(wǎng)絡(luò)優(yōu)化培訓(xùn)
  • 門(mén)戶網(wǎng)站建設(shè)自查整改怎么根據(jù)視頻鏈接找到網(wǎng)址
  • 網(wǎng)站注冊(cè)怎么做北京seo排名優(yōu)化網(wǎng)站
  • 唐山市住房和城鄉(xiāng)建設(shè)局門(mén)戶網(wǎng)站如何讓百度收錄
  • 兩學(xué)一做網(wǎng)站答題網(wǎng)址長(zhǎng)春最專(zhuān)業(yè)的seo公司
  • 商城網(wǎng)站源碼大全愛(ài)站工具seo綜合查詢(xún)
  • 中國(guó)建設(shè)銀行網(wǎng)站荊門(mén)網(wǎng)點(diǎn)查詢(xún)推推蛙品牌策劃
  • 2007年怎么做網(wǎng)站網(wǎng)絡(luò)推廣營(yíng)銷(xiāo)策劃方案
  • 網(wǎng)站設(shè)計(jì)公司種類(lèi)推薦一個(gè)seo優(yōu)化軟件
  • 蘇州有什么好玩的東莞百度搜索優(yōu)化
  • 有不收費(fèi)的網(wǎng)站seo引擎優(yōu)化培訓(xùn)