环境需求:redis3.8.2+maven+springBoot+jdk1.8模板
1、需求背景
周末在家,上家同事突然联系,让我给他网站,于是自己先梳理逻辑,实现功能并且记录下来。
这篇文章主要在上篇文章的基础上,实现登入拦截,保证用户在必须在登入的情况下,才能任意访问网站,因为上篇文章做SSO单点登入时,我们已经把用户信息存入redis,所以在拦截登入的时候,直接在redis里面取用户信息,判断用户是否登入过系统,用于拦截。
对redis实现系统单点登入功能感兴趣的同学,可以点进去看看:
2、功能实现演示
1、需要自己定义的配置类实现WebMvcConfigurer,
2、在方法preHandler里在每次访问接口前判断是否用户已登入,若redis存在用户信息,则返回true,业务继续进行,若未登入,返回false,并且用response跳转到登入页面,
那么登入页面的url从哪来呢,用request获取项目的虚拟路径,后面需要跳转的首页路径自己拼接。
3、拦截全部接口,那怎么能访问首页呢,所以要配置登入页面白名单,还有需要加载的js,css,png都配置成白名单。
当上面的全部实现后,就能看到,不论登入什么接口,都会跳转到system1当前接口来,想要实现这个功能,登入之后,就能任意访问。
3、代码详解
@Configuration
@Slf4j
public class LoginConfiguration implements WebMvcConfigurer {
@Resource
private RedisTemplate redisTemplate;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
InterceptorRegistration interceptorRegistration = registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("登入拦截器启动!!");
log.info("session是否存在:{}", request.getSession().getAttribute("name"));
if (request.getSession().getAttribute("name") != null) {
redisTemplate.opsForValue().set("name", request.getSession().getAttribute("name"), 10,TimeUnit.SECONDS);
return true;
}
log.info("request.getContextPath():{}", request.getContextPath());
response.sendRedirect(request.getContextPath() + "/redis/single/system1");
//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
log.info("afterCompletion");
}
});
//所有路径都被拦截
interceptorRegistration.addPathPatterns("/**");
//添加不拦截路径
interceptorRegistration.excludePathPatterns(
//"/redis/single/login_page",
"/redis/single/system1",
"/redis/single/system2",
"/redis/single/detection",
"/**/*.html",
"/**/*.js",
"/**/*.css",
"/**/*.woff",
"/**/*.ttf"
);
}
}