两次MD5加密
public class MD5Util {
public static String md5(String src){
return DigestUtils.md5Hex(src);
}
private static final String salt="1a2b3c4d";
public static String inputPassToFormPass(String inputPass){
String str= ""+salt.charAt(0)+ salt.charAt(2) + inputPass +salt.charAt(5)+salt.charAt(4);
System.out.println(str);
return md5(str);
}
public static String formPassToDBPass(String formpass, String salt){
String str= ""+salt.charAt(0)+salt.charAt(2) + formpass +salt.charAt(5) + salt.charAt(4);
return md5(str);
}
public static String inputPassToDbPass(String input,String saltDB){
String formPass= inputPassToFormPass(input);
String dbPass= formPassToDBPass(formPass,saltDB);
return dbPass;
}
public static void main(String[] args){
//System.out.println(inputPassToFormPass("12345"));
System.out.println(inputPassToDbPass("123456","1a2b3c4d"));
}
}
第一次加密根据盐值进行明文加密,也就是输入到服务器中传输的进行加密,这阶段主要是防止在传输信息的过程中被抓包获取到信息
第二次:在服务端再次加密,当获取到前端发送来的密码后。通过MD5(密码+随机盐值)再次生成密码后存入数据库,这一次加密的目的是防止从数据库中暴露信息。
Jsr303参数校验
还是先加入相关的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
使用Validated对前端传递参数进行校验,并且处理校验失败时的异常,同时对校验对象进行分组,解决了对于前端传递的数据需要进行验证的问题。以往需要写大量的if-else语句,现在直接使用注解便可限制,只需要将要限制的注解加在定义的参数上面即可如:
@NotNull
private String mobile;
@NotNull
@Length(min = 32)
private String password;
分布式session
首先要知道为什么要使用分布式session,用户的请求有可能随机落入到不同的服务器中,这样的结果将会导致用户的session丢失,分布式session说的就是Cookie,通过Redis缓存Token,简单明了的说就是用户每次登陆的时候生成一个类似sessionId的东西(也就是所谓的token,这将是全局的唯一标识,如UUID),将其写到cookie当中传送给客户端,客户端对数据库访问过程中不断上传这个token,而我们服务端拿到这个token就可以获取用户的在线信息。
具体代码如下:
public void addCookie(HttpServletResponse response, String token, MiaoshaUser user){
redisService.set(MiaoshaUserKey.token, token, user);
Cookie cookie = new Cookie(COOKIE_NAME_TOKEN, token);
cookie.setMaxAge(MiaoshaUserKey.token.expireSeconds());
cookie.setPath("/");
response.addCookie(cookie);
}
这里用到Token就是上面所说到的UUID,具体实现代码如下:
public class UUIDUtil {
public static String uuid(){
return UUID.randomUUID().toString().replace("-", "");
}
}
在之后通过建立新建WebConfig类和UserArgumentResolver类进行优化。
WebConfig类
```java
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
UserArgumentResolver userArgumentResolver;
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
利用addArgumentResolvers方法往Controller里面进行赋值。
UserArgumentResolve
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
MiaoshaUserService miaoshaUserService;
@Override
public boolean supportsParameter(MethodParameter Parameter) {
Class<?> clazz = Parameter.getParameterType();
return clazz == MiaoshaUser.class;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
String paramToken=request.getParameter(MiaoshaUserService.COOKIE_NAME_TOKEN);
String cookieToken=getCookieValue(request,MiaoshaUserService.COOKIE_NAME_TOKEN);
if (StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)){
return null;
}
String token= StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
return miaoshaUserService.getByToken(response, token);
}
private String getCookieValue(HttpServletRequest request, String cookieName) {
Cookie[] cookies=request.getCookies();
for (Cookie cookie : cookies){
if (cookie.getName().equals(cookieName)){
return cookie.getValue();
}
}
return null;
}
}
public boolean supportsParameter(MethodParameter Parameter) {
Class<?> clazz = Parameter.getParameterType();
return clazz == MiaoshaUser.class;
}
这里的代码主要是当遇到、MiaoshaUser里的参数才做处理。