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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot+2次MD5登录密码加密+MyBatisPlus+Thymeleaf+Bootstrap简单实现登录功能,一文轻松搞定!

發(fā)布時(shí)間:2024/1/18 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot+2次MD5登录密码加密+MyBatisPlus+Thymeleaf+Bootstrap简单实现登录功能,一文轻松搞定! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里寫目錄標(biāo)題

  • 一、演示GIF
  • 二、開發(fā)前期準(zhǔn)備
    • 1、數(shù)據(jù)庫
    • 2、依賴POM.XML
    • 3、idea結(jié)構(gòu)目錄
  • 三、后端
    • 1、實(shí)體類
    • 2、mapper接口
    • 3、mapper.xml
    • 4、Servicce接口
    • 5、Impl實(shí)現(xiàn)
    • 6、Controller控制器
    • 7、全局異常處理類
      • GlobalException
      • GlobalExceptionHandler
    • 8、工具類
      • MD5Util
      • UUIDUtil
      • CookieUtil
      • ValidatorUtil
    • 9、手機(jī)號(hào)處理類
      • validator
      • IsMobileValidator
    • 10、Vo類
      • LoginVo
      • RespBean
      • RespBeanEnum
  • 四、前端
      • login.html
      • list.html

一、演示GIF


本文通過SpringBoot+2次MD5登錄密碼加密+MyBatisPlus+Thymeleaf+bootstrap簡單實(shí)現(xiàn)登錄功能

  • 登錄時(shí)手機(jī)號(hào)作為賬號(hào)有驗(yàn)證
  • 密碼作為2次MD5加密
  • MybatisPlus開發(fā)時(shí)方便 高效
  • Bootstrap作為前端框架

二、開發(fā)前期準(zhǔn)備

1、數(shù)據(jù)庫

CREATE TABLE `t_user` (`id` bigint(20) NOT NULL COMMENT '用戶ID shoujihaoma',`nickname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,`pasword` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'MD5二次加密',`slat` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`head` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '頭像',`register_date` datetime DEFAULT NULL COMMENT '注冊(cè)時(shí)間',`last_login_date` datetime DEFAULT NULL COMMENT '最后一次登錄時(shí)間',`login_count` int(11) DEFAULT '0' COMMENT '登錄次數(shù)',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

2、依賴POM.XML

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- MD5依賴--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><!-- validation 參數(shù)校驗(yàn)-->`在這里插入代碼片`<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

3、idea結(jié)構(gòu)目錄

三、后端

1、實(shí)體類

package com.seckilldemo.pojo;import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode;import java.io.Serializable; import java.util.Date;/*** <p>** </p>** @author syj* @since 2023-01-14*/ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_user") public class User implements Serializable {private static final long serialVersionUID = 1L;/*** 用戶ID shoujihaoma*/private Long id;private String nickname;/*** MD5二次加密*/private String pasword;private String slat;/*** 頭像*/private String head;/*** 注冊(cè)時(shí)間*/private Date registerDate;/*** 最后一次登錄時(shí)間*/private Date lastLoginDate;/*** 登錄次數(shù)*/private Integer loginCount;}

2、mapper接口

package com.seckilldemo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.seckilldemo.pojo.User;/*** <p>* Mapper 接口* </p>** @author syj* @since 2023-01-14*/ public interface UserMapper extends BaseMapper<User> {}

3、mapper.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.seckilldemo.mapper.UserMapper"><!-- 通用查詢映射結(jié)果 --><resultMap id="BaseResultMap" type="com.seckilldemo.pojo.User"><id column="id" property="id" /><result column="nickname" property="nickname" /><result column="pasword" property="pasword" /><result column="slat" property="slat" /><result column="head" property="head" /><result column="register_date" property="registerDate" /><result column="last_login_date" property="lastLoginDate" /><result column="login_count" property="loginCount" /></resultMap><!-- 通用查詢結(jié)果列 --><sql id="Base_Column_List">id, nickname, pasword, slat, head, register_date, last_login_date, login_count</sql></mapper>

4、Servicce接口

package com.seckilldemo.service;import com.baomidou.mybatisplus.extension.service.IService; import com.seckilldemo.pojo.User; import com.seckilldemo.vo.LoginVo; import com.seckilldemo.vo.RespBean;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** <p>* 服務(wù)類* </p>** @author syj* @since 2023-01-14*/ public interface IUserService extends IService<User> {RespBean doLogin(LoginVo loginVo, HttpServletResponse response, HttpServletRequest request); }

5、Impl實(shí)現(xiàn)

package com.seckilldemo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.seckilldemo.exception.GlobalException; import com.seckilldemo.mapper.UserMapper; import com.seckilldemo.pojo.User; import com.seckilldemo.service.IUserService; import com.seckilldemo.utils.CookieUtil; import com.seckilldemo.utils.MD5Util; import com.seckilldemo.utils.UUIDUtil; import com.seckilldemo.utils.ValidatorUtil; import com.seckilldemo.vo.LoginVo; import com.seckilldemo.vo.RespBean; import com.seckilldemo.vo.RespBeanEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** <p>* 服務(wù)實(shí)現(xiàn)類* </p>** @author syj* @since 2023-01-14*/ @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Autowiredprivate UserMapper userMapper;@Overridepublic RespBean doLogin(LoginVo loginVo, HttpServletResponse response, HttpServletRequest request){String mobile = loginVo.getMobile();String password = loginVo.getPassword(); // if(StringUtils.isEmpty(mobile) || StringUtils.isEmpty(password)){ // return RespBean.error(RespBeanEnum.LOGIN_ERROR); // } // if(!ValidatorUtil.isMobile(mobile)){ // return RespBean.error(RespBeanEnum.MOBILE_ERROR); // }User user = userMapper.selectById(mobile);//根據(jù)手機(jī)號(hào)獲取用戶if (null == user){throw new GlobalException(RespBeanEnum.LOGIN_ERROR);}//判斷密碼是否正確if(!MD5Util.fromPassToDBPass(password,user.getSlat()).equals(user.getPasword())){throw new GlobalException(RespBeanEnum.LOGIN_ERROR);}//生成cokieString ticket = UUIDUtil.uuid();request.getSession().setAttribute(ticket,user);CookieUtil.setCookie(request,response,"userTicket",ticket);return RespBean.success();} }

6、Controller控制器

package com.seckilldemo.controller;import com.seckilldemo.service.IUserService; import com.seckilldemo.utils.ValidatorUtil; import com.seckilldemo.vo.LoginVo; import com.seckilldemo.vo.RespBean; import com.seckilldemo.vo.RespBeanEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid;@Controller @RequestMapping("/login") @Slf4j public class LoginController {@Autowiredprivate IUserService userService;@RequestMapping("/toLogin")public String toLogin(){return "login";}@RequestMapping("/doLogin")@ResponseBodypublic RespBean doLogin(@Valid LoginVo loginVo, HttpServletRequest request, HttpServletResponse response){return userService.doLogin(loginVo,response,request);}}

7、全局異常處理類

  • GlobalException

package com.seckilldemo.exception;import com.seckilldemo.vo.RespBean; import com.seckilldemo.vo.RespBeanEnum;/*** 全局異常** @author: LC* @date 2022/3/2 5:32 下午* @ClassName: GlobalException*/ public class GlobalException extends RuntimeException {private RespBeanEnum respBeanEnum;public RespBeanEnum getRespBeanEnum() {return respBeanEnum;}public void setRespBeanEnum(RespBeanEnum respBeanEnum) {this.respBeanEnum = respBeanEnum;}public GlobalException(RespBeanEnum respBeanEnum) {this.respBeanEnum = respBeanEnum;} }
  • GlobalExceptionHandler

package com.seckilldemo.exception;import com.seckilldemo.vo.RespBean; import com.seckilldemo.vo.RespBeanEnum; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 全局異常處理類** @author: LC* @date 2022/3/2 5:33 下午* @ClassName: GlobalExceptionHandler*/ @RestControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public RespBean ExceptionHandler(Exception e) {if (e instanceof GlobalException) {GlobalException exception = (GlobalException) e;return RespBean.error(exception.getRespBeanEnum());} else if (e instanceof BindException) {BindException bindException = (BindException) e;RespBean respBean = RespBean.error(RespBeanEnum.BIND_ERROR);respBean.setMessage("參數(shù)校驗(yàn)異常:" + bindException.getBindingResult().getAllErrors().get(0).getDefaultMessage());return respBean;}System.out.println("異常信息" + e);return RespBean.error(RespBeanEnum.ERROR);} }

8、工具類

  • CookieUtil
package com.seckilldemo.utils;import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder;/*** Cookie工具類** @author: LC* @date 2022/3/2 5:48 下午* @ClassName: CookieUtil*/ public final class CookieUtil {/*** 得到Cookie的值, 不編碼** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName) {return getCookieValue(request, cookieName, false);}/*** 得到Cookie的值,** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {if (isDecoder) {retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");} else {retValue = cookieList[i].getValue();}break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** 得到Cookie的值,** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** 設(shè)置Cookie的值 不設(shè)置生效時(shí)間默認(rèn)瀏覽器關(guān)閉即失效,也不編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue) {setCookie(request, response, cookieName, cookieValue, -1);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效,但不編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage) {setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);}/*** 設(shè)置Cookie的值 不設(shè)置生效時(shí)間,但編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, boolean isEncode) {setCookie(request, response, cookieName, cookieValue, -1, isEncode);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效, 編碼參數(shù)*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage, boolean isEncode) {doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效, 編碼參數(shù)(指定編碼)*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage, String encodeString) {doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);}/*** 刪除Cookie帶cookie域名*/public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,String cookieName) {doSetCookie(request, response, cookieName, "", -1, false);}/*** 設(shè)置Cookie的值,并使其在指定時(shí)間內(nèi)生效** @param cookieMaxage cookie生效的最大秒數(shù)*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {try {if (cookieValue == null) {cookieValue = "";} else if (isEncode) {cookieValue = URLEncoder.encode(cookieValue, "utf-8");}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0)cookie.setMaxAge(cookieMaxage);if (null != request) {// 設(shè)置域名的cookieString domainName = getDomainName(request);System.out.println(domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** 設(shè)置Cookie的值,并使其在指定時(shí)間內(nèi)生效** @param cookieMaxage cookie生效的最大秒數(shù)*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int cookieMaxage, String encodeString) {try {if (cookieValue == null) {cookieValue = "";} else {cookieValue = URLEncoder.encode(cookieValue, encodeString);}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0) {cookie.setMaxAge(cookieMaxage);}if (null != request) {// 設(shè)置域名的cookieString domainName = getDomainName(request);System.out.println(domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** 得到cookie的域名*/private static final String getDomainName(HttpServletRequest request) {String domainName = null;// 通過request對(duì)象獲取訪問的url地址String serverName = request.getRequestURL().toString();if (serverName == null || serverName.equals("")) {domainName = "";} else {// 將url地下轉(zhuǎn)換為小寫serverName = serverName.toLowerCase();// 如果url地址是以http://開頭 將http://截取if (serverName.startsWith("http://")) {serverName = serverName.substring(7);}int end = serverName.length();// 判斷url地址是否包含"/"if (serverName.contains("/")) {//得到第一個(gè)"/"出現(xiàn)的位置end = serverName.indexOf("/");}// 截取serverName = serverName.substring(0, end);// 根據(jù)"."進(jìn)行分割final String[] domains = serverName.split("\\.");int len = domains.length;if (len > 3) {// www.xxx.com.cndomainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];} else if (len <= 3 && len > 1) {// xxx.com or xxx.cndomainName = domains[len - 2] + "." + domains[len - 1];} else {domainName = serverName;}}if (domainName != null && domainName.indexOf(":") > 0) {String[] ary = domainName.split("\\:");domainName = ary[0];}return domainName;} }
  • MD5Util

package com.seckilldemo.utils;import org.apache.commons.codec.digest.DigestUtils; import org.springframework.stereotype.Component;@Component public class MD5Util {public static String md5(String src){return DigestUtils.md5Hex(src);}private static final String salt="1a2b3c4d";public static String inpuntPassToFromPass(String inputPass){String str = "" +salt.charAt(0)+salt.charAt(2)+inputPass+salt.charAt(5)+salt.charAt(4);return md5(str);}public static String fromPassToDBPass(String fromPass,String salt){String str = "" +salt.charAt(0)+salt.charAt(2)+fromPass+salt.charAt(5)+salt.charAt(4);return md5(str);}public static String inputPassToDBPass(String inputPass,String salt){String fromPass = inpuntPassToFromPass(inputPass);String dbPass = fromPassToDBPass(fromPass, salt);return dbPass;}public static void main(String[] args) {//d3b1294a61a07da9b49b6e22b2cbd7f9System.out.println(inpuntPassToFromPass("123456"));System.out.println(fromPassToDBPass("d3b1294a61a07da9b49b6e22b2cbd7f9","1a2b3c4d"));System.out.println(inputPassToDBPass("123456","1a2b3c4d"));} }
  • UUIDUtil

package com.seckilldemo.utils;import java.util.UUID;/*** UUID工具類** @author: LC* @date 2022/3/2 5:46 下午* @ClassName: UUIDUtil*/ public class UUIDUtil {public static String uuid() {return UUID.randomUUID().toString().replace("-", "");} }
  • CookieUtil

package com.seckilldemo.utils;import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder;/*** Cookie工具類** @author: LC* @date 2022/3/2 5:48 下午* @ClassName: CookieUtil*/ public final class CookieUtil {/*** 得到Cookie的值, 不編碼** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName) {return getCookieValue(request, cookieName, false);}/*** 得到Cookie的值,** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {if (isDecoder) {retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");} else {retValue = cookieList[i].getValue();}break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** 得到Cookie的值,** @param request* @param cookieName* @return*/public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {Cookie[] cookieList = request.getCookies();if (cookieList == null || cookieName == null) {return null;}String retValue = null;try {for (int i = 0; i < cookieList.length; i++) {if (cookieList[i].getName().equals(cookieName)) {retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);break;}}} catch (UnsupportedEncodingException e) {e.printStackTrace();}return retValue;}/*** 設(shè)置Cookie的值 不設(shè)置生效時(shí)間默認(rèn)瀏覽器關(guān)閉即失效,也不編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue) {setCookie(request, response, cookieName, cookieValue, -1);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效,但不編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage) {setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);}/*** 設(shè)置Cookie的值 不設(shè)置生效時(shí)間,但編碼*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, boolean isEncode) {setCookie(request, response, cookieName, cookieValue, -1, isEncode);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效, 編碼參數(shù)*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage, boolean isEncode) {doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);}/*** 設(shè)置Cookie的值 在指定時(shí)間內(nèi)生效, 編碼參數(shù)(指定編碼)*/public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,String cookieValue, int cookieMaxage, String encodeString) {doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);}/*** 刪除Cookie帶cookie域名*/public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,String cookieName) {doSetCookie(request, response, cookieName, "", -1, false);}/*** 設(shè)置Cookie的值,并使其在指定時(shí)間內(nèi)生效** @param cookieMaxage cookie生效的最大秒數(shù)*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {try {if (cookieValue == null) {cookieValue = "";} else if (isEncode) {cookieValue = URLEncoder.encode(cookieValue, "utf-8");}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0)cookie.setMaxAge(cookieMaxage);if (null != request) {// 設(shè)置域名的cookieString domainName = getDomainName(request);System.out.println(domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** 設(shè)置Cookie的值,并使其在指定時(shí)間內(nèi)生效** @param cookieMaxage cookie生效的最大秒數(shù)*/private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int cookieMaxage, String encodeString) {try {if (cookieValue == null) {cookieValue = "";} else {cookieValue = URLEncoder.encode(cookieValue, encodeString);}Cookie cookie = new Cookie(cookieName, cookieValue);if (cookieMaxage > 0) {cookie.setMaxAge(cookieMaxage);}if (null != request) {// 設(shè)置域名的cookieString domainName = getDomainName(request);System.out.println(domainName);if (!"localhost".equals(domainName)) {cookie.setDomain(domainName);}}cookie.setPath("/");response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}}/*** 得到cookie的域名*/private static final String getDomainName(HttpServletRequest request) {String domainName = null;// 通過request對(duì)象獲取訪問的url地址String serverName = request.getRequestURL().toString();if (serverName == null || serverName.equals("")) {domainName = "";} else {// 將url地下轉(zhuǎn)換為小寫serverName = serverName.toLowerCase();// 如果url地址是以http://開頭 將http://截取if (serverName.startsWith("http://")) {serverName = serverName.substring(7);}int end = serverName.length();// 判斷url地址是否包含"/"if (serverName.contains("/")) {//得到第一個(gè)"/"出現(xiàn)的位置end = serverName.indexOf("/");}// 截取serverName = serverName.substring(0, end);// 根據(jù)"."進(jìn)行分割final String[] domains = serverName.split("\\.");int len = domains.length;if (len > 3) {// www.xxx.com.cndomainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];} else if (len <= 3 && len > 1) {// xxx.com or xxx.cndomainName = domains[len - 2] + "." + domains[len - 1];} else {domainName = serverName;}}if (domainName != null && domainName.indexOf(":") > 0) {String[] ary = domainName.split("\\:");domainName = ary[0];}return domainName;} }
  • ValidatorUtil

package com.seckilldemo.utils;import org.thymeleaf.util.StringUtils;import java.util.regex.Matcher; import java.util.regex.Pattern;public class ValidatorUtil {private static final Pattern mobile_patten = Pattern.compile("[1]([3-9])[0-9]{9}$");public static boolean isMobile(String mobile){if(StringUtils.isEmpty(mobile)){return false;}Matcher matcher = mobile_patten.matcher(mobile);return matcher.matches();}}

9、手機(jī)號(hào)處理類

  • validator

package com.seckilldemo.validator; import com.seckilldemo.utils.ValidatorUtil;import javax.validation.Constraint; import javax.validation.Payload; import javax.validation.Validator; import javax.validation.constraints.NotNull; import java.lang.annotation.*;/*** 驗(yàn)證手機(jī)號(hào)** @author: LC* @date 2022/3/2 3:05 下午* @ClassName: isMobile*/ @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = {IsMobileValidator.class} ) public @interface IsMobile {boolean required() default true;String message() default "手機(jī)號(hào)碼格式錯(cuò)誤";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {}; }
  • IsMobileValidator

package com.seckilldemo.validator;import com.seckilldemo.utils.ValidatorUtil; import org.thymeleaf.util.StringUtils;import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;/*** 手機(jī)號(hào)碼校驗(yàn)規(guī)則** @author: LC* @date 2022/3/2 3:08 下午* @ClassName: IsMobileValidator*/ public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {private boolean required = false;@Overridepublic void initialize(IsMobile constraintAnnotation) { // ConstraintValidator.super.initialize(constraintAnnotation);required = constraintAnnotation.required();}@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if (required) {return ValidatorUtil.isMobile(s);} else {if (StringUtils.isEmpty(s)) {return true;} else {return ValidatorUtil.isMobile(s);}}} }

10、Vo類

  • LoginVo

package com.seckilldemo.vo;import com.seckilldemo.validator.IsMobile; import lombok.Data; import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotNull;@Data public class LoginVo {@NotNull@IsMobileprivate String mobile;@NotNull@Length(min = 32)private String password;}
  • RespBean

package com.seckilldemo.vo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;/*** 公共返回對(duì)象** @author: LC* @date 2022/3/2 1:50 下午* @ClassName: RespBean*/ @Data @NoArgsConstructor @AllArgsConstructor public class RespBean {private long code;private String message;private Object object;public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);}public static RespBean success(Object object) {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBean.success().getMessage(), object);}public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}public static RespBean error(RespBeanEnum respBeanEnum, Object object) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), object);}}
  • RespBeanEnum

package com.seckilldemo.vo;import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString;/*** 公共返回對(duì)象枚舉** @author: LC* @date 2022/3/2 1:44 下午* @ClassName: RespBean*/ @Getter @ToString @AllArgsConstructor public enum RespBeanEnum {//通用SUCCESS(200, "SUCCESS"),ERROR(500, "服務(wù)端異常"),//登錄模塊LOGIN_ERROR(500210, "用戶名或者密碼不正確"),MOBILE_ERROR(500211, "手機(jī)號(hào)碼格式不正確"),BIND_ERROR(500212, "參數(shù)校驗(yàn)異常"),MOBILE_NOT_EXIST(500213, "手機(jī)號(hào)碼不存在"),PASSWORD_UPDATE_FAIL(500214, "更新密碼失敗"),SESSION_ERROR(500215, "用戶SESSION不存在"),//秒殺模塊EMPTY_STOCK(500500, "庫存不足"),REPEATE_ERROR(500501, "該商品每人限購一件"),REQUEST_ILLEGAL(500502, "請(qǐng)求非法,請(qǐng)重新嘗試"),ERROR_CAPTCHA(500503, "驗(yàn)證碼錯(cuò)誤,請(qǐng)重新輸入"),ACCESS_LIMIT_REACHED(500504, "訪問過于頻繁,請(qǐng)稍后重試"),//訂單模塊5003xxORDER_NOT_EXIST(500300, "訂單不存在"),;private final Integer code;private final String message;}

四、前端

  • login.html

<!DOCTYPE html> <html lang="en"xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"><title>登錄</title><!-- jquery --><script type="text/javascript" th:src="@{/js/jquery.min.js}"></script><!-- bootstrap --><link rel="stylesheet" type="text/css" th:href="@{/bootstrap/css/bootstrap.min.css}"/><script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}"></script><!-- jquery-validator --><script type="text/javascript" th:src="@{/jquery-validation/jquery.validate.min.js}"></script><script type="text/javascript" th:src="@{/jquery-validation/localization/messages_zh.min.js}"></script><!-- layer --><script type="text/javascript" th:src="@{/layer/layer.js}"></script><!-- md5.js --><script type="text/javascript" th:src="@{/js/md5.min.js}"></script><!-- common.js --><script type="text/javascript" th:src="@{/js/common.js}"></script> </head> <body> <form name="loginForm" id="loginForm" method="post" style="width:50%; margin:0 auto"><h2 style="text-align:center; margin-bottom: 20px">用戶登錄</h2><div class="form-group"><div class="row"><label class="form-label col-md-4">請(qǐng)輸入手機(jī)號(hào)碼</label><div class="col-md-5"><input id="mobile" name="mobile" class="form-control" type="text" placeholder="手機(jī)號(hào)碼" required="true"/><!-- 取消位數(shù)限制 minlength="11" maxlength="11"--></div><div class="col-md-1"></div></div></div><div class="form-group"><div class="row"><label class="form-label col-md-4">請(qǐng)輸入密碼</label><div class="col-md-5"><input id="password" name="password" class="form-control" type="password" placeholder="密碼"required="true"/><!-- 取消位數(shù)限制 minlength="6" maxlength="16"--></div></div></div><div class="row"><div class="col-md-5"><button class="btn btn-primary btn-block" type="reset" onclick="reset()">重置</button></div><div class="col-md-5"><button class="btn btn-primary btn-block" type="submit" onclick="login()">登錄</button></div></div> </form> </body> <script>function login() {$("#loginForm").validate({submitHandler: function (form) {doLogin();}});}function doLogin() {g_showLoading();var inputPass = $("#password").val();var salt = g_passsword_salt;var str = "" + salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);var password = md5(str);$.ajax({url: "/login/doLogin",type: "POST",data: {mobile: $("#mobile").val(),password: password},success: function (data) {layer.closeAll();if (data.code == 200) {layer.msg("成功");console.log(data);document.cookie = "userTicket=" + data.object;window.location.href = "/goods/toList";} else {layer.msg(data.message);}},error: function () {layer.closeAll();}});} </script> </html>
  • list.html

<!DOCTYPE html> <html lang="en"xmlns:th="http://www.thymeleaf.org"> <head><meta charset="UTF-8"><title>商品列表</title> </head> <body><p th:text="'Hello:'+${user.nickname}"></p> </body> </html>

總結(jié)

以上是生活随笔為你收集整理的SpringBoot+2次MD5登录密码加密+MyBatisPlus+Thymeleaf+Bootstrap简单实现登录功能,一文轻松搞定!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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