這里寫目錄標(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
- 四、前端
-
一、演示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
;
@Data
@
EqualsAndHashCode(callSuper
= false)
@
TableName("t_user")
public class
User implements
Serializable {private static final long serialVersionUID
= 1L
;private Long id
;private String nickname
;private String pasword
;private String slat
;private String head
;private Date registerDate
;private Date lastLoginDate
;private Integer loginCount
;}
2、mapper接口
package com
.seckilldemo
.mapper
;import com
.baomidou
.mybatisplus
.core
.mapper
.BaseMapper
;
import com
.seckilldemo
.pojo
.User
;
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
;
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
;
@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();
User user
= userMapper
.selectById(mobile
);if (null == user
){throw new GlobalException(RespBeanEnum
.LOGIN_ERROR
);}if(!MD5Util
.fromPassToDBPass(password
,user
.getSlat()).equals(user
.getPasword())){throw new GlobalException(RespBeanEnum
.LOGIN_ERROR
);}String 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、全局異常處理類
package com
.seckilldemo
.exception
;import com
.seckilldemo
.vo
.RespBean
;
import com
.seckilldemo
.vo
.RespBeanEnum
;
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
;}
}
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
;
@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、工具類
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
;
public final class
CookieUtil {public static String
getCookieValue(HttpServletRequest request
, String cookieName
) {return getCookieValue(request
, cookieName
, false);}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
;}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
;}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
) {setCookie(request
, response
, cookieName
, cookieValue
, -1);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
) {setCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, false);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, boolean isEncode
) {setCookie(request
, response
, cookieName
, cookieValue
, -1, isEncode
);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
, boolean isEncode
) {doSetCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, isEncode
);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
, String encodeString
) {doSetCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, encodeString
);}public static void
deleteCookie(HttpServletRequest request
, HttpServletResponse response
,String cookieName
) {doSetCookie(request
, response
, cookieName
, "", -1, false);}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
) {String domainName
= getDomainName(request
);System
.out
.println(domainName
);if (!"localhost".equals(domainName
)) {cookie
.setDomain(domainName
);}}cookie
.setPath("/");response
.addCookie(cookie
);} catch (Exception e
) {e
.printStackTrace();}}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
) {String domainName
= getDomainName(request
);System
.out
.println(domainName
);if (!"localhost".equals(domainName
)) {cookie
.setDomain(domainName
);}}cookie
.setPath("/");response
.addCookie(cookie
);} catch (Exception e
) {e
.printStackTrace();}}private static final String
getDomainName(HttpServletRequest request
) {String domainName
= null;String serverName
= request
.getRequestURL().toString();if (serverName
== null || serverName
.equals("")) {domainName
= "";} else {serverName
= serverName
.toLowerCase();if (serverName
.startsWith("http://")) {serverName
= serverName
.substring(7);}int end
= serverName
.length();if (serverName
.contains("/")) {end
= serverName
.indexOf("/");}serverName
= serverName
.substring(0, end
);final String
[] domains
= serverName
.split("\\.");int len
= domains
.length
;if (len
> 3) {domainName
= domains
[len
- 3] + "." + domains
[len
- 2] + "." + domains
[len
- 1];} else if (len
<= 3 && len
> 1) {domainName
= domains
[len
- 2] + "." + domains
[len
- 1];} else {domainName
= serverName
;}}if (domainName
!= null && domainName
.indexOf(":") > 0) {String
[] ary
= domainName
.split("\\:");domainName
= ary
[0];}return domainName
;}
}
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
) {System
.out
.println(inpuntPassToFromPass("123456"));System
.out
.println(fromPassToDBPass("d3b1294a61a07da9b49b6e22b2cbd7f9","1a2b3c4d"));System
.out
.println(inputPassToDBPass("123456","1a2b3c4d"));}
}
package com
.seckilldemo
.utils
;import java
.util
.UUID
;
public class
UUIDUtil {public static String
uuid() {return UUID
.randomUUID().toString().replace("-", "");}
}
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
;
public final class
CookieUtil {public static String
getCookieValue(HttpServletRequest request
, String cookieName
) {return getCookieValue(request
, cookieName
, false);}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
;}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
;}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
) {setCookie(request
, response
, cookieName
, cookieValue
, -1);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
) {setCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, false);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, boolean isEncode
) {setCookie(request
, response
, cookieName
, cookieValue
, -1, isEncode
);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
, boolean isEncode
) {doSetCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, isEncode
);}public static void
setCookie(HttpServletRequest request
, HttpServletResponse response
, String cookieName
,String cookieValue
, int cookieMaxage
, String encodeString
) {doSetCookie(request
, response
, cookieName
, cookieValue
, cookieMaxage
, encodeString
);}public static void
deleteCookie(HttpServletRequest request
, HttpServletResponse response
,String cookieName
) {doSetCookie(request
, response
, cookieName
, "", -1, false);}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
) {String domainName
= getDomainName(request
);System
.out
.println(domainName
);if (!"localhost".equals(domainName
)) {cookie
.setDomain(domainName
);}}cookie
.setPath("/");response
.addCookie(cookie
);} catch (Exception e
) {e
.printStackTrace();}}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
) {String domainName
= getDomainName(request
);System
.out
.println(domainName
);if (!"localhost".equals(domainName
)) {cookie
.setDomain(domainName
);}}cookie
.setPath("/");response
.addCookie(cookie
);} catch (Exception e
) {e
.printStackTrace();}}private static final String
getDomainName(HttpServletRequest request
) {String domainName
= null;String serverName
= request
.getRequestURL().toString();if (serverName
== null || serverName
.equals("")) {domainName
= "";} else {serverName
= serverName
.toLowerCase();if (serverName
.startsWith("http://")) {serverName
= serverName
.substring(7);}int end
= serverName
.length();if (serverName
.contains("/")) {end
= serverName
.indexOf("/");}serverName
= serverName
.substring(0, end
);final String
[] domains
= serverName
.split("\\.");int len
= domains
.length
;if (len
> 3) {domainName
= domains
[len
- 3] + "." + domains
[len
- 2] + "." + domains
[len
- 1];} else if (len
<= 3 && len
> 1) {domainName
= domains
[len
- 2] + "." + domains
[len
- 1];} else {domainName
= serverName
;}}if (domainName
!= null && domainName
.indexOf(":") > 0) {String
[] ary
= domainName
.split("\\:");domainName
= ary
[0];}return domainName
;}
}
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)處理類
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
.*;
@
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
{};
}
package com
.seckilldemo
.validator
;import com
.seckilldemo
.utils
.ValidatorUtil
;
import org
.thymeleaf
.util
.StringUtils
;import javax
.validation
.ConstraintValidator
;
import javax
.validation
.ConstraintValidatorContext
;
public class
IsMobileValidator implements
ConstraintValidator<IsMobile
, String
> {private boolean required
= false;@Overridepublic void
initialize(IsMobile 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類
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
;}
package com
.seckilldemo
.vo
;import lombok
.AllArgsConstructor
;
import lombok
.Data
;
import lombok
.NoArgsConstructor
;
@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
);}}
package com
.seckilldemo
.vo
;import lombok
.AllArgsConstructor
;
import lombok
.Getter
;
import lombok
.ToString
;
@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)稍后重試"),ORDER_NOT_EXIST(500300, "訂單不存在"),;private final Integer code
;private final String message
;}
四、前端
<!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
>
<!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ò),歡迎將生活随笔推薦給好友。