文章目录
- 登录模块
- 注册
- 登录
- 账号设置
登录模块
重要知识点:
- ThreadLocal,Hostholder采用Threadlocal持有用户信息,用于代替session对象
- ThreadLocal采用线程隔离的方式存放数据,可以避免多线程之间出现数据访问冲突。
- ThreadLocal提供set方法,能够以当前线程为key存放数据。
- ThreadLocal提供get方法,能够以当前线程为key获取数据。
- ThreadLocal提供remove方法,能够以当前线程为key删除数据。
- 拦截器
-
拦截器示例
-
定义拦截器,实现HandlerInterceptor
在controller/interceptor路径下定义拦截器,使用@Compont注解,implements HandlerInterceptor,里面有三个方法可以重写
- preHandle() // 在Controller之前执行,若返回false,则终止执行后续的请求。
- postHandle() // 在Controller之后执行,模版之前执行。
- afterCompletion() // 在模版引擎TemplteEngine之后执行。
-
配置拦截器,为他指定拦截、排除的路径
WebMvcConfig implements WebMvcConfigurer,实现WebMvcConfigurer接口
首先使用@Autowired注解注入拦截器,然后重写addInterceptors()方法
-
-
拦截器应用(显示登录信息)
- 在请求开始时查询登录用户
- 在本次请求中持有用户数据
- 在模板视图上显示用户数据
- 在请求结束时清理用户数据
- 提示:拦截器在controller执行前执行preHolder,根据登录凭证(这里的登录凭证是从cookie中获得的,该cookie不能由@CookieValue获得,只能从request请求中获得指定cookie(封装为一个工具类),)获得用户信息,然后存到hostHolder中(这里的用户信息,是通过ThreadLocal来持有的,代替了session,hostHolder也封装为了一个工具类),在controller执行后,模版之前执行postHandle,将用户信息存到modelandview中,用来写出到模板,在模板执行后执行afterCompletion,清空hostHolder中的用户信息,节省内存空间。
-
拦截器应用(检查登录状态)
-
使用拦截器的另一种方法
- 首先定义自定义注解。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LoginRequired { }
- 在需要拦截的方法前标注自定义注解
- 拦截所有请求,只处理带有该注解的方法
@Component public class LoginRequiredInterceptor implements HandlerInterceptor { @Autowired private HostHolder hostHolder; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 首先判断拦截到的是不是一个方法 if(handler instanceof HandlerMethod){ // 获取拦截到的Method对象 HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); // 获取Method的注解 LoginRequired longinRequired = method.getAnnotation(LoginRequired.class); // 如果有loginRequired注解但是没有登录,说明当前方法需要登录,但是没有登录,那么拒绝后续请求,强制重定向到登录页面 if(longinRequired != null && hostHolder.getUser() == null){ response.sendRedirect(request.getContextPath()+"/login"); return false; } } return true; } }
-
自定义注解
- 常用的元注解:@Targrt、@Retention、@Document、@Inherited
- @Targrt:自定义注解可以作用在哪里、
- @Retention:自定义注解什么时候有效、编译时?运行时?
- @Document:生成文档时要不要把注解也带上去、
- @Inherited:用于继承
- 如何读取注解:利用反射Method
- Method.getDeclaredAnnotations()
- Method.getAnnotation(Class annotationClass)
- 常用的元注解:@Targrt、@Retention、@Document、@Inherited
-
注册
- 访问注册页面、提交注册数据、发送邮件激活、激活注册账号
登录
- 访问登录页面,生成验证码,提交登录数据,显示登录信息,退出功能
账号设置
- 访问账号设置页面,修改头像,修改密码,检查登录状态