登录信息的显示
1.拦截器
测试:
1. 在controller的目录下interceptor目录的Alphalnterceptor类
@Component
public class Alphalnterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(Alphalnterceptor.class);
//在Controller之前完成
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("preHandle: "+handler.toString());
return true;
}
//调用Controller之后执行,在模板引擎之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.debug("postHandle: "+handler.toString());
}
//模板引擎执行之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.debug("afterCompletion: "+handler.toString());
}
}
2. Alphalnterceptor的配置类WebMvcConfig
@Configuration //表示是配置类
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private Alphalnterceptor alphalnterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(alphalnterceptor)//增加拦截
.excludePathPatterns("/**/*.css","/**/*.js","/**/*.png","/**/*.jpg","/**/*.jpeg")//设置排除拦截的目录(/**表示目录下所有文件夹)
.addPathPatterns("/register","/login");//设置拦截的目录
}
}
2. Community项目:
LoginTicketInterceptor拦截类:
@Component
public class LoginTicketInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Autowired
private HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//从cookie中获取凭证
String ticket = CookieUtil.getValue(request, "ticket");
if (ticket != null){
//查询凭证
LoginTicket loginTicket = userService.findLoginTicket(ticket);
//验证凭证是否有效
if (loginTicket != null && loginTicket.getStatus() == 0 && loginTicket.getExpired().after(new Date())){//不为空,状态有效,未超时
//根据凭证查询用户
User user = userService.findUserById(loginTicket.getUserId());
//在本次请求持有用户()(在多个线程进行隔离)(调用util类HostHolder)
hostHolder.setUser(user);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
User user = hostHolder.getUser();
if (user != null || modelAndView != null){
modelAndView.addObject("loginUser",user);
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
hostHolder.clear();
}
}
CookieUtil类
/***
* 封装了查询通过cookie名直接查询value
*/
public class CookieUtil {
public static String getValue(HttpServletRequest request,String name){
if (request == null || name == null){
try {
throw new IllegalAccessException("参数为空");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie : cookies){
if (cookie.getName().equals(name)){
return cookie.getValue();
}
}
}
return null
}
}
HostHolder类
/***
* 持有用户的信息,代替session对象
* 用隔离线程存储信息
* 这样可以防止多个人访问时多线程冲突问题
*/
@Component
public class HostHolder {
private ThreadLocal<User> users = new ThreadLocal<>();
public void setUser(User user){
users.set(user);
}
public User getUser(){
return users.get();
}
//清理
public void clear(){
users.remove();
}
}