**
 * 远程Session
 * 存放在Memcached缓存服务器里的Session
 * @author lx
 *
 */
public class CacheSessionProvider implements SessionProvider {
    @Autowired
    private MemCachedClient  memCachedClient;
    private final String SESSIONID="sessionId";
    //设置数据保存在memcached的保存时间
    private final Integer  expiry=30*60;

    /**
     * 将session的值通过sessionId值存入memcached中
     */
    public void setAttribute(HttpServletRequest request, String name, Serializable value,HttpServletResponse response) {
        // TODO Auto-generated method stub
        Map<String, Serializable> session=new HashMap<String, Serializable>();
        session.put(name, value);
        String sessionId=getSessionId(request, response);
        memCachedClient.set(sessionId, session, expiry);
    }
/**
 * 通过用户本地的sessionId值到服务器获取session
 * 从缓存服务器memcached中获取sessionId值对应的session
 */
    public Serializable getAttribute(HttpServletRequest request, String name,HttpServletResponse response) {
        // TODO Auto-generated method stub
        String sessionId=getSessionId(request, response);
        Map<String, Serializable> session = (Map<String, Serializable>)memCachedClient.get(sessionId);
        //返回保存在session中的用户数据
        if(session!=null){
            return session.get(name);
        }
        return null;
    }
    /**
     * 
     * 删除缓存服务器memcached中中key=sessionId,这样用户即使
     * 通过本地的sessionID也获取不到用户的数据
     */
    public void logout(HttpServletRequest request,HttpServletResponse response) {
        // TODO Auto-generated method stub
        //用户本地cookie
        String sessionId=getSessionId(request, response);
        if(memCachedClient.keyExists(sessionId)){
            memCachedClient.delete(sessionId);
        }

    }
/**
 * 获取sessionId,如果用户没有sessionId,则为用户创建一个sessionId
 */
    public String getSessionId(HttpServletRequest request,HttpServletResponse response) {
        //获取存储在cookie的sessionId
           Cookie[] cookies = request.getCookies();
           if(cookies!=null && cookies.length>0){
               for (Cookie cookie : cookies) {
                   if(SESSIONID.equals(cookie.getName())){
                       return cookie.getValue();
                   }
            }
           }
           //如果没有sessionId,为用户创建一个
           String sessionId=UUID.randomUUID().toString().replaceAll("-", "");
           Cookie cookie=new Cookie(SESSIONID, sessionId);
           cookie.setMaxAge(-1);// 默认-1,代表关闭浏览器就销毁cookie
           cookie.setPath("/");
           response.addCookie(cookie);
        return sessionId;
    }
posted on 2017-06-14 15:42  2637282556  阅读(85)  评论(0编辑  收藏  举报