两次MD5加密,分布式Session

本文探讨了两次MD5加密的重要性,首次加密用于保护传输过程中的信息安全,第二次加密则是在服务端增加数据库存储的安全性。同时介绍了Jsr303参数校验,通过注解简化前端参数验证。最后讲解了分布式Session的必要性和实现方式,利用Redis缓存Token解决跨服务器session丢失问题,通过UUID作为全局唯一标识,并展示了相关配置代码。
摘要由CSDN通过智能技术生成

两次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里的参数才做处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值