單點登錄配合攔截器使用案例


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM