使用JDK自帶緩存(Cache)實現Cookie自動登陸


自定義一個緩存類AdminCache

package jw.admin.common;

import jw.base.entity.Admin;
import sun.security.util.Cache;

public class AdminCache {

    //第一個參數表示cache對象中允許添加的鍵值對數量,第二個參數表示緩存的時間,單位是秒
    private static Cache cache = Cache.newHardMemoryCache(0,3600 * 24 * 7);

    public static Admin get(String key){
        return (Admin)cache.get(key);
    }
    public static void set(String key,Admin admin){
        AdminCache.cache.put(key,admin);
    }

}

登陸成功發送Cookie到客戶端並保存到緩存中

//如果選擇記住登錄狀態,把用戶簽名保存到cookie中,把簽名和簽名的對象保存到緩存中
if (remember == true){
    Cookie cookie = new Cookie("adminSign",admin.sign());
    cookie.setMaxAge(60 * 60 * 24 * 7);
    cookie.setPath("/");
    response.addCookie(cookie);
    AdminCache.set(admin.sign(),admin);
}

在spring-servlet中配置攔截器路徑

<mvc:interceptors>
        <!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
        <bean class="jw.admin.interceptor.AuthInterceptor"/>
        <bean class="jw.admin.interceptor.AuthCookieInterceptor"/>
</mvc:interceptors>

攔截器內容

package jw.admin.interceptor;

import jw.admin.common.AdminCache;
import jw.base.entity.Admin;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class AuthCookieInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();

        //判斷session中的用戶信息是否存在,不存在從cookie中獲取然后裝如session
        if(session.getAttribute("admin") == null){
            Cookie[] cookies = request.getCookies();
            if(cookies != null && cookies.length > 0){
                for(int i = 0; i < cookies.length; i++){
                    if(cookies[i].getName().equals("adminSign")){
                        String sign = cookies[i].getValue();
                        Admin admin = AdminCache.get(sign); //根據簽名獲取用戶的完整信息裝如session
                        session.setAttribute("admin",admin);
                        break;
                    }
                }
            }
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

 


免責聲明!

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



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