日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 登录_Spring boot redis +mysql实现登录功能

發(fā)布時間:2025/3/13 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 登录_Spring boot redis +mysql实现登录功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????????在前面的文章中呢,我們介紹了spring ?boot 集成Druid,集成了mysql ,在實際的開發(fā)過程中呢,我們還需要利用redis 做一些緩存之類的數(shù)據(jù),怎樣去鏈接redis呢,本篇文章給大家講解下,首先呢,我們還是需要去配置對應(yīng)的庫的。在我們的pom.xml去配置我們的redis。

<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-redisartifactId> <version>2.2.2.RELEASEversion> dependency>

然后去會自動的去下載對應(yīng)的庫,那么我們還需要在application.yaml配置,如下配置

redis: port: 6379????host:?127.0.0.1 jedis: pool: max-active: 1000 min-idle: 200 timeout: 1000

鏈接的端口呢? 是6379,鏈接的host 是redis的host,超時是1000, 最大活躍是1000 。這樣配置好了,就完成了最簡單的操作,這樣是就可以鏈接到我們的redis了,當(dāng)然不能啊,你還要啟動你的 redis的服務(wù)呢,不啟動是沒有辦法鏈接的,那么我們可以利用之前學(xué)的docker 去搭建我們的redis的服務(wù)。

搜索后,我們運行docker pull redis,下載鏡像。

下載完畢,輸入

docker images

查看本地的鏡像。

然后去啟動我們的鏡像

docker?run?-itd?--name?redis?-p?6379:6379?redis

這樣就可以啟動我們的redis的實例。我這里呢,打開界面管理工具,就鏈接到了redis 上面,

????因為我這里的redis最近在使用,所以大家會看到有數(shù)據(jù)的。

????????那么我們在Springboot 怎么使用redis 呢。

@Autowiredprivate?RedisTemplate?redisTemplate;

首先呢,我們?nèi)ゼ虞d這個,然后我們要制定我們redis的庫,所以進(jìn)行簡單的封裝。

private RedisTemplate userredis(RedisTemplate redisTemplate) { redisTemplate = RedisDbInit.initRedis(2, redisTemplate); return redisTemplate; }

那么我們這樣就完成了封裝,接下來就是操作了,我這里還是去實現(xiàn)用戶的登錄,這里呢,對用戶登錄錯誤密碼輸入固定的時間超時后呢,我們就對用戶進(jìn)行禁止登錄。

@Override public UserVo login(String username, String password) { Instant inst1 = Instant.now(); /*根據(jù)郵箱或者用戶名登錄*/ User user = userRepository.findByUsername(username);????????//查詢,用戶是否存在 if (user != null) { UserVo userVo = login_is(user, password, username); Instant inst2 = Instant.now(); System.out.println("登錄接口內(nèi)部耗時:" + Duration.between(inst1, inst2).toMillis()); return userVo; } else {????????//查詢郵箱,支持郵箱登錄 User useremail = userRepository.findByEmail(username); if (useremail != null) { //存在,調(diào)用封裝好d的方法 UserVo userVo = login_is(useremail, password, username); return userVo; } } throw new PanExection(ResultEmus.USER_NOT_EXIT); }if (user.getStatus().equals(UserEmus.DELETE.getCode())) { throw new PanExection(ResultEmus.USER_DELETE); } //判斷用戶密碼是否正確 Boolean b; try { b = MD5Until.checkoutpassword(password, user.getPassword()); } catch (Exception e) { throw new PanExection(ResultEmus.EXCEPTIONS); } if (b) { //密碼正確 Date date = new Date(); String tokne; //token生產(chǎn) try { tokne = MD5Until.md5(user.getUsername() + date.toString()); } catch (Exception e) { log.error("登錄產(chǎn)生token時候失敗!原因是:" + e.getMessage()); throw new PanExection(ResultEmus.EXCEPTIONS); } UserVo userVo = new UserVo(); userVo.setId(user.getId()); userVo.setEmail(user.getEmail()); userVo.setToken(tokne); userVo.setUsername(user.getUsername()); //存儲token String token = user.getUsername() + "_" + tokne; userredis(redisTemplate).opsForValue().set(username, token, 1, TimeUnit.DAYS); useridport(redisTemplate).opsForValue().set(user.getUsername(), user.getId().toString(), 1, TimeUnit.DAYS); return userVo; } else { //密碼不正確,判斷是否有錯誤的存在,有,累加, String reslut = (String) userredis(redisTemplate).opsForValue().get("login_" + user.getId().toString()); if (reslut == null) { userredis(redisTemplate).opsForValue().set("login_" + user.getId(), "1", 10, TimeUnit.MINUTES); throw new PanExection(ResultEmus.USER_ERROR_PASSWORD); } else { if (4 < Integer.parseInt(reslut)) { throw new PanExection(ResultEmus.USER_FREE); } else { Integer num = Integer.parseInt(reslut) + 1; userredis(redisTemplate).opsForValue().set("login_" + user.getId(), (num.toString()), 10, TimeUnit.MINUTES); throw new PanExection(ResultEmus.USER_ERROR_PASSWORD); } } }

備注,PanExection代碼如下

@Getterpublic class PanExection extends RuntimeException { private Integer code; public PanExection(ResultEmus resultEmuns) { super(resultEmuns.getMessage()); this.code = resultEmuns.getCode(); } public PanExection(CaseResultEmus resultEmuns) { super(resultEmuns.getMessage()); this.code = resultEmuns.getCode(); } public PanExection(Integer code, String message) { super(message); this.code = code; }}

對一場進(jìn)行處理。完成上述的開發(fā)呢,我們可以寫一個接口來測試下。

@ApiOperation(value = "登錄", notes = "用戶登錄") @PostMapping(value = "/login", produces = "application/json") public ResultVO login(@Valid UserForm userForm, BindingResult bindingResult, HttpServletRequest httpServletRequest) { if (bindingResult.hasErrors()) { throw new PanExection(ResultEmus.PARM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage()); } UserVo login = userSerice.login(userForm.getUsername(), userForm.getPassword());???????if(login!=null){???????return ResultVOUntils.success("ok");???????}???????return ResultVOUntils.error(1, "密碼或者用戶名錯誤");???????}ResultVOUntilspublic class ResultVOUntils { public static ResultVO success(Object object) { ResultVO resultVO = new ResultVO(); resultVO.setData(object); resultVO.setMsg("成功"); resultVO.setCode(0); return resultVO; } public static ResultVO success() { return success(null); } public static ResultVO error(Integer code, String msg) { ResultVO resultVO = new ResultVO(); resultVO.setCode(code); resultVO.setMsg(msg); return resultVO; } public static ResultVO error(Object object) { ResultVO resultVO = new ResultVO(); resultVO.setData(object); resultVO.setMsg("失敗"); resultVO.setCode(1); return resultVO; }}

這樣就可以在本地,啟動我們的服務(wù),去測試我們功能是否可以正常。測試下

那么我們看redis 有沒有存儲上去呢,打開redis 查看下。

????????????這樣我么在spring boot ?+redis ?就實現(xiàn)完畢了,我們還可以在緩存中使用。本人只是介紹了一個小功能。利用redis 來存儲錯誤次數(shù),在規(guī)定時間內(nèi)輸入錯誤 就標(biāo)記失敗,我們還可以查看redis key的過去時間。

SELECT 2 切換數(shù)據(jù)pttl?? 查看key的過期時間

? ? 后續(xù)的文章還會持續(xù)介紹spring ?boot ?的相關(guān)文章,后續(xù)可以持續(xù)關(guān)注。雷子說測試。

總結(jié)

以上是生活随笔為你收集整理的mysql 登录_Spring boot redis +mysql实现登录功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。