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

Java簡(jiǎn)易登錄注冊(cè)功能實(shí)現(xiàn)代碼解析

 更新時(shí)間:2020年06月16日 11:33:05   作者:Biem  
這篇文章主要介紹了Java簡(jiǎn)易登錄注冊(cè)功能實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

哈希算法(Hash)又稱摘要算法(Digest),它的作用是:對(duì)任意一組輸入數(shù)據(jù)進(jìn)行計(jì)算,得到一個(gè)固定長(zhǎng)度的輸出摘要。
哈希算法最重要的特點(diǎn)就是:

  • 相同的輸入一定得到相同的輸出;
  • 不同的輸入大概率得到不同的輸出。
  • 哈希算法的目的就是為了驗(yàn)證原始數(shù)據(jù)是否被篡改。

我們來(lái)簡(jiǎn)單實(shí)現(xiàn)一個(gè)用于用戶注冊(cè)和登錄最基本的功能。

在登錄中,要檢查是否存在某個(gè)用戶信息,每個(gè)用戶信息都是唯一的,所以可以借助Set的特性來(lái)操作用戶信息的存放。

在注冊(cè)中,要檢查用戶名是否已經(jīng)被注冊(cè),而每個(gè)用戶名也是唯一的,所以在這里也利用Set來(lái)操作用戶名的存放。

當(dāng)然,也可以用Map來(lái)存放用戶名和用戶密碼,K存放用戶名,對(duì)應(yīng)的V存放密碼。但是為了讓用戶名和密碼的關(guān)聯(lián)度盡可能的小一些,所以利用兩個(gè)Set來(lái)分別存放用戶名和用戶信息。

由于Set是無(wú)序的,所以當(dāng)黑客獲取到這兩個(gè)數(shù)據(jù)文件的時(shí)候也很難將用戶名對(duì)應(yīng)到相應(yīng)的用戶信息。

這里的用戶信息指的是將用戶名和密碼混合后的信息,例如某個(gè)用戶的信息是"admin",密碼是"password",那么可以將這兩個(gè)字段混合來(lái)達(dá)到增長(zhǎng)信息量的目的。

當(dāng)然,為了讓安全性更高,可以利用特定的排列組合將兩個(gè)字符串混合,比如可以將兩個(gè)字符串拆解成字符數(shù)組,按照數(shù)組下標(biāo)的奇偶數(shù)來(lái)排列兩個(gè)字符串。

例如"admin"的長(zhǎng)度小于"password",因此以"admin"為基準(zhǔn),'a'為起始,"admin"占奇數(shù)位,"passw"占偶數(shù)位,剩余字符連接在生成字段后,即"apdamsisnword",就像把用戶名插入到了密碼中。

還有一種方法是對(duì)每個(gè)生成的用戶信息添加隨機(jī)字符,這個(gè)方法被稱為“加鹽”。

例如,用戶名和密碼依然是"admin"和"password",我們?cè)O(shè)置一個(gè)隨機(jī)salt = "aRandomSalt",然后將這個(gè)salt加入到用戶名和密碼之中,比如"admin" + salt + "password",salt + "admin" + "password"或是其他更復(fù)雜的組合。

后續(xù)的代碼中,簡(jiǎn)單的將用戶名和密碼連接在了一起,即"adminpassword"

package service;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.HashSet;
import java.util.Set;

import dao.Dao; // 儲(chǔ)存相關(guān)配置文件
import dao.UserInfoDao; // 用于將用戶信息存盤
import entity.UserInfo; // 用戶信息實(shí)體類,其中的兩個(gè)類成員是userName和userPassword,即用戶名和密碼

public class UserInfoService extends Dao {
	private String userInfoPath; // 用戶信息保存的文件路徑
	private String userNamePath; // 用戶名保存的文件路徑
	private UserInfoDao dao = new UserInfoDao();

	public UserInfoService() {
		super();
		userInfoPath = super.getResource().getString("userInfo");
		userNamePath = super.getResource().getString("userName");
	}

	/**
	 * 用戶登錄。若用戶信息存在,則登錄成功;若用戶信息不存在,則登錄失敗
	 * 
	 * @param userInfo
	 * @return 提示信息
	 */
	public String userSignIn(UserInfo userInfo) {
		Set<String> userInfoSet = null;
		String tips;
		userInfoSet = dao.readInfo(userInfoPath); // 從相關(guān)文件中讀取用戶信息
		if (userInfoSet == null) { // 若尚無(wú)用戶注冊(cè),則new HashSet<String>(),避免NullPointerException
			userInfoSet = new HashSet<String>();
		}
		if (userInfoSet.contains(getUserInfoHashCode(userInfo))) { // 判斷是否含有相關(guān)用戶信息
			tips = "登錄成功!";
		} else {
			tips = "登錄失??!請(qǐng)檢查用戶名或密碼";
		}
		return tips;
	}

	/**
	 * 用戶注冊(cè)。若用戶名不存在,則注冊(cè)成功;若用戶名存在,則注冊(cè)失敗
	 * 
	 * @param userInfo
	 * @return 提示信息
	 */
	public String userSignUp(UserInfo userInfo) {
		Set<String> userInfoSet = null;
		Set<String> userNameSet = null;
		String tips;
		userInfoSet = dao.readInfo(userInfoPath); // 從相關(guān)文件中讀取用戶信息
		userNameSet = dao.readInfo(userNamePath); // 從相關(guān)文件中讀取用戶名
		if (userInfoSet == null) { // 若尚無(wú)用戶注冊(cè),則new HashSet<String>(),避免NullPointerException
			userInfoSet = new HashSet<String>();
		}
		if (userNameSet == null) { // 若尚無(wú)用戶注冊(cè),則new HashSet<String>(),避免NullPointerException
			userNameSet = new HashSet<String>();
		}
		if (userNameSet.add(userInfo.getUserName())) { // 判斷用戶名是否已注冊(cè)
			userInfoSet.add(getUserInfoHashCode(userInfo)); // 若用戶名未注冊(cè),則將用戶信息添加至Set中
			dao.saveInfo(userInfoSet, userInfoPath); // 保存用戶信息到相關(guān)文件
			dao.saveInfo(userNameSet, userNamePath); // 保存用戶名到相關(guān)文件
			tips = "注冊(cè)成功!";
		} else {
			tips = "注冊(cè)失??!用戶已存在";
		}
		return tips;
	}

	/**
	 * 以預(yù)設(shè)算法SHA-1加密用戶名和密碼,以預(yù)設(shè)基數(shù)36位保存
	 * 
	 * @param userInfo
	 * @return 加密后的用戶信息
	 */
	public String getUserInfoHashCode(UserInfo userInfo) {
		return getUserInfoHashCode(userInfo, "SHA-1", 36); // 用SHA-1算法生成用戶信息密鑰,進(jìn)制為36進(jìn)制
	}

	/**
	 * 以指定算法algorithm加密用戶名和密碼,以指定基數(shù)radix長(zhǎng)度保存
	 * 
	 * @param userInfo
	 * @param algorithm
	 * @param radix
	 * @return 加密后的用戶信息
	 */
	public String getUserInfoHashCode(UserInfo userInfo, String algorithm, int radix) {
		try {
			MessageDigest md = MessageDigest.getInstance(algorithm); // 用指定算法algorithm創(chuàng)建一個(gè)MessageDigest實(shí)例
			md.update((userInfo.getUserName() + userInfo.getUserPassword()).getBytes("UTF-8")); // 將用戶名和密碼合并,調(diào)用update()輸入數(shù)據(jù)
			byte[] res = md.digest(); // 將摘要存放在byte[]中
			return new BigInteger(1, res).toString(radix); // 返回一個(gè)指定進(jìn)制基數(shù)為radix的字符串
		} catch (Exception e) {
			e.printStackTrace();
			return ""; // 若異常則返回空字符串
		}
	}
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析

    SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析

    這篇文章主要介紹了SpringBoot注解@Import原理之關(guān)于ConfigurationClassPostProcessor源碼解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java中Collections.sort排序詳解

    java中Collections.sort排序詳解

    這篇文章主要介紹了java中Collections.sort排序詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解spring boot集成RabbitMQ

    詳解spring boot集成RabbitMQ

    RabbitMQ作為AMQP的代表性產(chǎn)品,在項(xiàng)目中大量使用。結(jié)合現(xiàn)在主流的spring boot,極大簡(jiǎn)化了開發(fā)過(guò)程中所涉及到的消息通信問(wèn)題。
    2017-03-03
  • 基于Maven pom文件使用分析

    基于Maven pom文件使用分析

    本文詳細(xì)介紹了Maven項(xiàng)目的核心配置文件pom.xml的結(jié)構(gòu)和各個(gè)元素的用途,包括項(xiàng)目基礎(chǔ)信息、依賴管理、倉(cāng)庫(kù)配置、構(gòu)建配置、版本控制、分發(fā)和報(bào)告配置等,幫助讀者全面了解Maven項(xiàng)目的構(gòu)建和管理過(guò)程
    2024-12-12
  • SpringBoot如何升級(jí)到3.0

    SpringBoot如何升級(jí)到3.0

    這篇文章主要介紹了SpringBoot如何升級(jí)到3.0問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • SpringBoot+Tess4j實(shí)現(xiàn)牛的OCR識(shí)別工具的示例代碼

    SpringBoot+Tess4j實(shí)現(xiàn)牛的OCR識(shí)別工具的示例代碼

    這篇文章主要介紹了SpringBoot+Tess4j實(shí)現(xiàn)牛的OCR識(shí)別工具的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • LCN分布式事務(wù)解決方案詳解

    LCN分布式事務(wù)解決方案詳解

    這篇文章主要介紹了LCN分布式事務(wù)解決方案詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • springboot集成mybaits-generator自動(dòng)生成代碼的流程分析

    springboot集成mybaits-generator自動(dòng)生成代碼的流程分析

    這篇文章主要介紹了springboot集成mybaits-generator自動(dòng)生成代碼的流程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2025-04-04
  • JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼

    JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼

    這篇文章主要介紹了JNI實(shí)現(xiàn)最簡(jiǎn)單的JAVA調(diào)用C/C++代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 微信小程序與Java后端接口交互

    微信小程序與Java后端接口交互

    本文主要介紹了微信小程序與Java后端接口交互,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

邛崃市| 化隆| 工布江达县| 平昌县| 曲沃县| 罗城| 龙川县| 枣庄市| 新巴尔虎右旗| 浮梁县| 九台市| 安仁县| 长乐市| 浦北县| 肥东县| 临夏县| 万源市| 永州市| 隆回县| 三江| 澎湖县| 科尔| 马龙县| 射洪县| 大余县| 江源县| 邯郸市| 隆安县| 吉安县| 介休市| 兴义市| 东辽县| 民勤县| 临洮县| 集贤县| 措美县| 喀喇沁旗| 西贡区| 通江县| 伊宁县| 宾川县|