全局异常处理器
全局异常处理就是一种将控制器中出现的异常进行统一捕获和处理的策略。
具体实现:
使用时需要先定义一个独立的类,添加@ControllerAdvice注解,表明该类为一个全局异常处理器,并应用到所有的控制器上。通常也会加@ResponseBody注解,用于将返回信息转换客户端可理解的josn格式。
之后编写异常处理方法,在方法上加@ExceptionHandler注解指定捕获的异常种类,其中异常的种类可以是自定义的。方法中通常会先用lombok将异常记录到日志,在检查和解析完异常信息后构建一个特定的错误信息并返回给控制台。
登录细节
流程:
登录做的是短信验证码的方式,验证信息和用户数据存储用的是redis实现的分布session。
校验手机号成功后会发送一个六位随机数的验证码,用手机号查找用户是否存在,不存在就跳转注册,存在就生成token然后走拦截器验证。这里拦截器为了解决用户在操作网站时由于token 过期,直接退出网站的问题分成了两部分,前置拦截器用来拦截所有请求并刷新有效期,后置拦截器拦截登录请求验证用户信息。
为什么用分布式session? 具体实现
利用redis的hash结构,以key-value的方式存储验证信息和用户数据,借助redis对session进行统一的存储和管理,这样不管请求发送到哪台服务器,服务器都会从同一个redis中获取session信息,解决了session共享问题。
过期时间设置
对于验证码这类数据,一般设置TTL为3min即可,防止大量缓存数据的堆积,而对于用户信息这类数据可以稍微设置长一点,比如30min,防止频繁对Redis进行IO操作。