权限需求说明:如果用户不登录,则不允许访问购物车/订单等业务.如果用户在不登录的条件下访问涉密的业务,应该跳转到用户的登陆页面
拦截器执行示意图
创建拦截器
@Component
public class UserInterceptor implements HandlerInterceptor{
/**
* SpringMVC框架单独封装的拦截器API.简化程序调用过程.
* 旧配置:web.xml
* 拦截器说明:
* 一般使用拦截器时主要的目的是为了控制页面请求的跳转.
* 1.preHandle 处理器执行之前进行拦截
* 2.postHandle 处理器执行完成之后拦截
* 3.afterCompletion 全部业务逻辑执行完成之后并且视图渲染之后拦截
*/
/**
* 控制用户登录
* boolean
* true: 表示放行
* false: 表示拦截
*
* 拦截器业务分析:
* 如果用户登陆则放行.
* 如果用户未登录则拦截.
* 如何判断用户是否登录
* 1.检查用户是否有Cookie信息.
* 2.检查redis服务器中是否有ticket信息.
* 如果上述判断正常,则表示用户已登录,可以放行.
*/
@Autowired
private JedisCluster jedisCluster;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.判断用户是否有cookie.
String ticket = CookieUtil.getCookieValue(request, "JT_TICKET");
if(!StringUtils.isEmpty(ticket)) {
//2.表示ticket信息不为null 有值
String userJSON = jedisCluster.get(ticket);
if(!StringUtils.isEmpty(userJSON)) {
//redis数据一切正常
return true; //请求放行
}else {
//用户有ticket,但是redis中没有改数据.,cookie有问题
CookieUtil.deleteCookie(response,"JT_TICKET","jt.com", "/");
}
}
//重定向到用户的登陆页面
response.sendRedirect("/user/login.html");
return false;
}
}
添加拦截器配置
/**
* 伪静态核心,拦截.html请求,利用配置类代替web.xml配置
*/
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {
@Autowired
private UserInterceptor userInterceptor;
//开启匹配后缀型配置 /index,/index.html,/index.abc,拦截之后,执行视图解析器
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
}
//添加拦截器配置
// /cart/** 所有的路径 /cart/* 一级目录
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor).addPathPatterns("/cart/**", "/order/**");
}
}