最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot實現(xiàn)注冊加密與登錄解密功能(demo)

 更新時間:2020年02月24日 15:55:07   作者:zuojunZzz  
這篇文章主要介紹了springboot實現(xiàn)注冊的加密與登錄的解密功能,本文通過demo實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

前情提要:本demo是基于springboot+mybatis-plus實現(xiàn)加密,加密為主,全局異常處理,日志處理為輔,而登錄密碼加密是每個項目中必須要的,密碼不可能明文存入數(shù)據(jù),這樣沒有安全性。
涉及的功能,全局異常處理,日志處理,mybatis-plus實現(xiàn)與數(shù)據(jù)庫的交互,密碼加密,restful風(fēng)格

涉及的工具:IDEA,postman,sqlyog(navicat)

1. 首先我們直接看效果吧,如果你不滿意,也就沒必要看了

如果這正是你想要的效果呢,那你可以繼續(xù)看下面的內(nèi)容了

2. 首先,我們看下pom.xml文件

以下依賴為所需的主要依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.2.4.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.jgsu</groupId>
 <artifactId>springboot_rsa_encryption</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>springboot_encryption</name>
 <description>Demo project for Spring Boot</description>
 <properties>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <!-- WEB依賴 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <!-- 熱部署依賴 -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
 <optional>true</optional>
 </dependency>
 <!-- mysql的依賴,用于連接數(shù)據(jù)庫-->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.47</version>
 </dependency>
 <!-- lombok依賴,簡化set/get方法 -->
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.16.20</version>
 </dependency>
 <!--druid數(shù)據(jù)源-->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-starter</artifactId>
 <version>1.1.10</version>
 </dependency>
 <!--mybatis-plus-->
 <dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.2.0</version>
 </dependency>
 <!--spring-security實現(xiàn)密碼加密-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
 <version>2.1.6.RELEASE</version>
 </dependency>
 <!--fastjsoon-->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.2.51</version>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>

3. 創(chuàng)建啟動類SpringbootEncryptionApplication

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootApplication
@MapperScan("com.jgsu.mapper")
public class SpringbootEncryptionApplication {
 public static void main(String[] args) {
 SpringApplication.run(SpringbootEncryptionApplication.class, args);
 }

 /**
 * 將加密工具類加入IOC容器中,便于加密
 * */
 @Bean
 public BCryptPasswordEncoder encoder() {
 return new BCryptPasswordEncoder();
 }
}

4.實體類

這里只有用戶名和密碼(其他數(shù)據(jù)自己可擴(kuò)展)

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
 @TableId(value = "id",type = IdType.AUTO)
 private int id;
 private String username;
 private String password;
}

5. service層(業(yè)務(wù)層)

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jgsu.entity.User;
import com.jgsu.exception.DataAddException;
import com.jgsu.exception.DataMatchException;
import com.jgsu.mapper.UserMapper;
import com.jgsu.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class UserServiceImpl implements UserService {
 @Autowired
 UserMapper userMapper;
 // 數(shù)據(jù)加密,在啟動類中已經(jīng)注入進(jìn)IOC容器中
 @Autowired
 private BCryptPasswordEncoder encoder;
 @Override
 public User userLogin(String username,String password) {
 // mybatis-plus的條件構(gòu)造器,這里實現(xiàn)根據(jù)username查詢
 QueryWrapper<User> wrapper = new QueryWrapper<User>();
 wrapper.eq("username", username);
 User userLogin = userMapper.selectOne(wrapper);
 /**
 * encoder.matches(password, userLogin.getPassword(),實現(xiàn)輸入的密碼與數(shù)據(jù)庫中的密碼進(jìn) 
 * 行匹配,如果匹配成功則返回匹配的數(shù)據(jù)給controller層,如果失敗則拋異常。
 * 為什么沒鹽,沒有解密了?因為這個已經(jīng)被CryptPasswordEncoder封裝好了,
 * 在encoder.matches()方進(jìn)行解密匹配完全幫你封裝好了,所以不必考慮,
 * 只需要將前端傳入的密碼與數(shù)據(jù)庫中加密后的密碼進(jìn)行匹配就行。
 * **/
 if (userLogin != null && encoder.matches(password, userLogin.getPassword())) {
 log.info("用戶{},登錄成功",username);
 return userLogin;
 } else {
 log.error("用戶名或密碼錯誤");
 throw new DataMatchException("405", "用戶名或密碼錯誤");
 }
 }
 @Override
 public User userRegister(String username, String password) {
 User user = new User();
 user.setId(user.getId());
 user.setUsername(username);
 user.setPassword(encoder.encode(password));
 int i = userMapper.insert(user);
 if (i == 1){
 log.info("用戶{}注冊成功",username);
 return user;
 }else {
 log.error("服務(wù)器發(fā)生異常,注冊失敗");
 throw new DataAddException("403","注冊失敗");
 }
 }
}

6. mapper層

如果不了解,可以建議去看看mybatis-plus官方文檔

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jgsu.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}

7.controller層

import com.jgsu.entity.User;
import com.jgsu.service.UserService;
import com.jgsu.utils.CommonResult;
import com.jgsu.utils.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
 @Autowired
 UserService userService;
 // 注冊,基于restful風(fēng)格
 @GetMapping("/register/{username}/{password}")
 public CommonResult register(@PathVariable("username") String username,@PathVariable("password") String password){
 User user = userService.userRegister(username, password);
 if (user != null){
 return CommonResult.success(ResultCode.SUCCESS);
 }else {
 return CommonResult.failed(ResultCode.FAILED);
 }
 }
 // 登錄,基于restful風(fēng)格
 @GetMapping("/login/{username}/{password}")
 public CommonResult login(@PathVariable("username") String username,@PathVariable("password") String password) {
 User userLogin = userService.userLogin(username,password);
 if (userLogin != null) {
 return CommonResult.success(ResultCode.SUCCESS);
 } else {
 return CommonResult.failed(ResultCode.USERNAME_OR_PASSWORD_ERROR);
 }
 }
}

8.配置類(返回json數(shù)據(jù)的類)

封裝錯誤碼的接口

public interface IErrorCode {
 long getState();
 String getMessage();
}

枚舉了一些常用API操作碼

public enum ResultCode implements IErrorCode {
 /**
 * 成功
 */
 SUCCESS(200, "ok"),
 /**
 * 失敗
 */
 FAILED(500, "server error"),
 /**
 * 驗證過期
 */
 VALIDATE_FAILED(404, "undefined"),
 /**
 * 未登錄
 */
 UNAUTHORIZED(401, "未登錄"),
 /**
 * 用戶名或密碼錯誤
 */
 USERNAME_OR_PASSWORD_ERROR(405, "用戶名或密碼錯誤"),
 /**
 * 數(shù)據(jù)查詢錯誤
 */
 DATA_Not_Exist_ERROR(603, "數(shù)據(jù)不存在"),
 /**
 * 數(shù)據(jù)添加出現(xiàn)問題
 */
 DATA_ADD_ERROR(604, "數(shù)據(jù)添加異常"),
 /**
 * 文件
 */
 FILE_ERROR(605, "上傳文件出現(xiàn)錯誤"),
 /**
 * 數(shù)據(jù)查詢出現(xiàn)問題
 */
 IMAGE_ERROR(606, "圖片處理出現(xiàn)錯誤"),
 /**
 * 權(quán)限不夠
 */
 FORBIDDEN(403, "forbidden");
 private long state;
 private String stateInfo;
 ResultCode(long state, String stateInfo) {
 this.state = state;
 this.stateInfo = stateInfo;
 }
 @Override
 public long getState() {
 return state;
 }
 @Override
 public String getMessage() {
 return stateInfo;
 }
}

通用返回對象

public class CommonResult<T> {
 private long state;
 private String stateInfo;
 private T data;
 public CommonResult() {
 }
 public CommonResult(long state, String stateInfo, T data) {
 this.state = state;
 this.stateInfo = stateInfo;
 this.data = data;
 }
 public CommonResult(long state, String stateInfo) {
 this.state = state;
 this.stateInfo = stateInfo;
 }
 /**
 * 成功返回結(jié)果
 *
 * @param data 獲取的數(shù)據(jù)
 */
 public static <T> CommonResult<T> success(T data) {
 return new CommonResult<T>(ResultCode.SUCCESS.getState(), ResultCode.SUCCESS.getMessage(), data);
 }
 /**
 * 成功返回結(jié)果
 * @param data 獲取的數(shù)據(jù)
 * @param message 提示信息
 * @return
 */
 public static <T> CommonResult<T> success(T data, String message) {
 return new CommonResult<T>(ResultCode.SUCCESS.getState(), message, data);
 }
 /**
 * 失敗返回結(jié)果
 * @param errorCode 錯誤碼
 */
 public static <T> CommonResult<T> failed(IErrorCode errorCode) {
 return new CommonResult<T>(errorCode.getState(), errorCode.getMessage(), null);
 }
 /**
 * 失敗返回結(jié)果
 * @param message 提示信息
 */
 public static <T> CommonResult<T> failed(String message) {
 return new CommonResult<T>(ResultCode.FAILED.getState(), message, null);
 }
 /**
 * 失敗返回結(jié)果
 * @param code
 * @param message
 */
 public static <T> CommonResult<T> failed(int code, String message) {
 return failed(ResultCode.FAILED);
 }
 /**
 * 參數(shù)驗證失敗返回結(jié)果
 */
 public static <T> CommonResult<T> validateFailed() {
 return failed(ResultCode.VALIDATE_FAILED);
 }
 /**
 * 參數(shù)驗證失敗返回結(jié)果
 * @param message 提示信息
 */
 public static <T> CommonResult<T> validateFailed(String message) {
 return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getState(), message, null);
 }
 /**
 * 未登錄返回結(jié)果
 */
 public static <T> CommonResult<T> unauthorized(T data) {
 return new CommonResult<T>(ResultCode.UNAUTHORIZED.getState(), ResultCode.UNAUTHORIZED.getMessage(), data);
 }
 /**
 * 未授權(quán)返回結(jié)果
 */
 public static <T> CommonResult<T> forbidden(T data) {
 return new CommonResult<T>(ResultCode.FORBIDDEN.getState(), ResultCode.FORBIDDEN.getMessage(), data);
 }
 public long getState() {
 return state;
 }
 public void setState(long state) {
 this.state = state;
 }
 public String getStateInfo() {
 return stateInfo;
 }
 public void setStateInfo(String stateInfo) {
 this.stateInfo = stateInfo;
 }
 public T getData() {
 return data;
 }
 public void setData(T data) {
 this.data = data;
 }
}

9. 異常類

全局異常攔截類

@Slf4j
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHander {
 @ExceptionHandler(value = Exception.class)
 public CommonResult handlerException(Exception e){
 if (e instanceof DataAddException){
 log.error("【全局異常攔截】DataAddException: 請求方法 {}, 請求路徑 {}",((DataAddException)e).getCode(),((DataAddException)e).getMessage());
 return CommonResult.failed(ResultCode.DATA_ADD_ERROR);
 }else if (e instanceof DataMatchException){
 log.error("【全局異常攔截】DataMatchException: 請求方法 {}, 請求路徑 {}",((DataMatchException)e).getCode(),((DataMatchException)e).getMessage());
 return CommonResult.failed(ResultCode.USERNAME_OR_PASSWORD_ERROR);
 } else {
 log.error("服務(wù)器內(nèi)部出錯{}",e);
 return CommonResult.failed(ResultCode.FAILED);
 }
 }
}

自定義數(shù)據(jù)添加異常類

public class DataAddException extends RuntimeException {
 private String code;
 private String message;
 public DataAddException(String code, String message) {
 this.code = code;
 this.message = message;
 }
 public String getCode() {
 return code;
 }
 public void setCode(String code) {
 this.code = code;
 }
 @Override
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
}


自定義數(shù)據(jù)匹配異常類

public class DataMatchException extends RuntimeException {
 private String code;
 private String message;
 public DataMatchException(String code, String message) {
 this.code = code;
 this.message = message;
 }
 public String getCode() {
 return code;
 }
 public void setCode(String code) {
 this.code = code;
 }
 @Override
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
}

以上是實現(xiàn)該功能的所有類,當(dāng)然進(jìn)行密碼加密處理的類只涉及service層以及啟動類,其他類為基本類,如果你只想了解怎么進(jìn)行加密處理存入數(shù)據(jù)庫以及怎么登陸就看看service層就行。

總結(jié)

到此這篇關(guān)于springboot實現(xiàn)注冊的加密與登錄的解密功能的文章就介紹到這了,更多相關(guān)springboot實現(xiàn)注冊的加密與登錄的解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java向MySQL添加中文數(shù)據(jù)數(shù)據(jù)庫顯示亂碼的解決方案

    Java向MySQL添加中文數(shù)據(jù)數(shù)據(jù)庫顯示亂碼的解決方案

    在用springboot做項目時,由于重新安裝了本地Mysql數(shù)據(jù)庫(5.7版本)在前臺向數(shù)據(jù)庫插入和更新數(shù)據(jù)可的時候,涉及中文的時候在數(shù)據(jù)庫一直顯示異常,所以本文給大家介紹了相關(guān)的解決方案,需要的朋友可以參考下
    2024-02-02
  • 詳解SpringBoot中的參數(shù)校驗(項目實戰(zhàn))

    詳解SpringBoot中的參數(shù)校驗(項目實戰(zhàn))

    這篇文章主要介紹了SpringBoot中的參數(shù)校驗,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 通過Java實現(xiàn)帶干擾線的驗證碼

    通過Java實現(xiàn)帶干擾線的驗證碼

    帶干擾線的驗證碼是一種常見的安全驗證方式,目的是通過圖像中的干擾線增加機(jī)器識別的難度,確保只有人類用戶能夠順利識別并輸入驗證碼,本項目的目的是通過Java實現(xiàn)一個帶有干擾線的驗證碼生成器,需要的朋友可以參考下
    2025-02-02
  • java?cpu飆升問題的詳細(xì)分析和處理方法

    java?cpu飆升問題的詳細(xì)分析和處理方法

    Java中CPU占用過高是一個常見的問題,可能是由于線程過多、死循環(huán)、長時間的阻塞、死鎖、GC頻繁等原因?qū)е碌?這篇文章主要介紹了java?cpu飆升問題的詳細(xì)分析和處理方法,需要的朋友可以參考下
    2025-03-03
  • java?mybatis如何操作postgresql?array數(shù)組類型

    java?mybatis如何操作postgresql?array數(shù)組類型

    這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • @JsonSerialize序列化注解的使用

    @JsonSerialize序列化注解的使用

    這篇文章主要介紹了@JsonSerialize序列化注解的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 利用Java實現(xiàn)玩家打怪小游戲的完整過程

    利用Java實現(xiàn)玩家打怪小游戲的完整過程

    這篇文章主要介紹了如何使用Java創(chuàng)建一個簡單的“打怪小游戲”,游戲中的角色分為法師、戰(zhàn)士、BOSS和一個Team類,代碼展示了如何通過面向?qū)ο缶幊虂韺崿F(xiàn)一個基本的戰(zhàn)斗系統(tǒng),需要的朋友可以參考下
    2024-12-12
  • SpringBoot之瘦身部署問題

    SpringBoot之瘦身部署問題

    這篇文章主要介紹了SpringBoot之瘦身部署問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • spring中的事務(wù)執(zhí)行流程圖解

    spring中的事務(wù)執(zhí)行流程圖解

    這篇文章主要介紹了spring中的事務(wù)執(zhí)行流程圖解,Spring事務(wù)是Spring框架提供的一種管理數(shù)據(jù)庫事務(wù)的機(jī)制,它通過將一系列數(shù)據(jù)庫操作封裝在一個事務(wù)中,保證這些操作要么全部成功執(zhí)行,要么全部回滾,從而確保數(shù)據(jù)的一致性和完整性,需要的朋友可以參考下
    2023-10-10
  • java中i=i++和j=i++的區(qū)別小結(jié)

    java中i=i++和j=i++的區(qū)別小結(jié)

    這篇文章主要給大家介紹了關(guān)于java中i=i++和j=i++區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

改则县| 兴安县| 望城县| 乌海市| 互助| 祥云县| 保德县| 屏东市| 汕尾市| 华安县| 合水县| 蕉岭县| 页游| 兴仁县| 高州市| 辽阳市| 镇安县| 贵南县| 阜宁县| 西昌市| 白山市| 嘉峪关市| 额尔古纳市| 孟连| 友谊县| 民县| 随州市| 南充市| 班戈县| 克山县| 边坝县| 叙永县| 久治县| 古丈县| 扶沟县| 资源县| 伊金霍洛旗| 泸水县| 镇远县| 岱山县| 扎鲁特旗|