1.定義攔截器:
//定義用戶攔截器 public class UserInterceptor implements HandlerInterceptor{ @Autowired private JedisCluster jedisCluster; private ObjectMapper objectMapper = new ObjectMapper(); /** * 1.獲取用戶Cookie獲取token數據 * 2.判斷token中是否有數據 * false 表示沒有登陸,則重定向到用戶登陸頁面 * * true :表示用戶之前登陸過 * 從redis中根據token獲取userJSON, * 再次判斷數據是否有數據 * * false: 沒有數據,則重定向到用戶登陸頁面 * true : 表示有數據,則程序予以放行. */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1.獲取Cookiez中的token String token = null; Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if("JT_TICKET".equals(cookie.getName())){ token = cookie.getValue(); break; } } //2.判斷token是否有數據 if(token != null){ //2.1判斷redis集群中是否有數據 String userJSON = jedisCluster.get(token); if(userJSON != null){ User user = objectMapper.readValue(userJSON,User.class); //將user數據保存到ThreadLocal中 UserThreadLocal.set(user); //證明用戶已經登陸 予以放行 return true; } } //配置重定向 response.sendRedirect("/user/login.html"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //關閉threadLocal UserThreadLocal.remove(); } }
2.配置攔截器
<!--配置攔截器 ((bean | ref) | interceptor)+ bean 攔截器的bean標簽 <ref/> 對象的引用 <mvc:mapping path=""/> 攔截器攔截的路徑 <mvc:exclude-mapping path=""/> 不需要攔截的路徑 path="/cart/*" 只能攔截/cart/一級目錄 path="/cart/**" 攔截/cart/全部目錄 定義單個攔截器 Content Model : (mapping+, exclude-mapping*, (bean | ref)) --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/cart/**"/> <mvc:mapping path="/order/**"/> <bean class="com.jt.web.interceptor.UserInterceptor"/> </mvc:interceptor> </mvc:interceptors>