0
点赞
收藏
分享

微信扫一扫

登录信息显示

Go_Viola 2022-03-11 阅读 42
javahtmlcss

登录信息的显示

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();
    }
}
举报

相关推荐

0 条评论