ApiSessionManager.java 4.25 KB
package com.xiniunet.open.manager;

import com.xiniunet.apiframework.session.Session;
import com.xiniunet.apiframework.session.SessionManager;
import com.xiniunet.apiframework.session.SimpleSession;
import com.xiniunet.framework.security.Identity;
import com.xiniunet.framework.security.Passport;
import com.xiniunet.framework.util.TypeTransferUtil;
import com.xiniunet.security.request.PassportGetRequest;
import com.xiniunet.security.response.PassportGetResponse;
import com.xiniunet.security.service.SecurityService;
import com.xiniunet.xntalk.request.IdentityGetRequest;
import com.xiniunet.xntalk.response.IdentityGetResponse;
import com.xiniunet.xntalk.service.UnionService;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 
 * @author xiniunet
 *
 */
public class ApiSessionManager implements SessionManager {
	private static final Map<String, Session> sessionCache = new ConcurrentHashMap<String, Session>(128, 0.75f, 32);
    @Autowired
    private SecurityService securityService;
    @Autowired
    private UnionService unionService;

	@Override
	public void addSession(String sessionId, Session session) {
		sessionCache.put(sessionId, session);
	}

	@Override
	public Session getSession(String sessionId) {
        if (sessionId == null || sessionId.equals("null")) {
            return null;
        }
        Session session = sessionCache.get(sessionId);
        if (session != null) {
            //验证SessionId 是否过期
            Passport passport = (Passport) session.getAttribute("passport");
            if (passport != null && !isExpire(passport.getExpireTime())) {
                return session;
            }

            //验证SessionId 是否过期
            Identity identity = (Identity) session.getAttribute("identity");
            if(identity != null) {
                Calendar calendar = new GregorianCalendar();
                calendar.setTime(identity.getIssueTime());
                calendar.add(calendar.DATE, 1);
                if (!isExpire(calendar.getTime())) {
                    return session;
                }
            }
            //删除session信息
            sessionCache.remove(sessionId);
            return null;
        } else {
            PassportGetRequest request = new PassportGetRequest();
            request.setId(Long.valueOf(sessionId));
            PassportGetResponse response = securityService.getPassport(request);
            if (response == null || response.hasError() || response.getPassport() == null) {
                if (response.getPassport() == null) {
                    IdentityGetRequest request2 = new IdentityGetRequest();
                    request2.setId(Long.valueOf(sessionId));
                    IdentityGetResponse response2 = unionService.getIdentity(request2);
                    if (response2 == null || response2.hasError() || response2.getIdentity() == null) {
                        return null;
                    }
                    Identity identity = response2.getIdentity();
                    if (identity == null) {
                        return null;
                    }
                    session = new SimpleSession();
                    session.setAttribute("identity", identity);
                    sessionCache.put(sessionId, session);
                    return session;
                }else{
                    return  null;
                }
            } else {
                Passport passport = new TypeTransferUtil<Passport>().transfer(response.getPassport(), Passport.class);

                if (passport == null || isExpire(passport.getExpireTime())) {
                    return null;
                }
                session = new SimpleSession();
                session.setAttribute("passport", passport);
                sessionCache.put(sessionId, session);
                return session;
            }

        }
    }

	@Override
	public void removeSession(String sessionId) {
		sessionCache.remove(sessionId);
	}
    //判断session是否过期
    private boolean isExpire(Date date){
        if(date==null||date.before(new Date())){
             return true;
        }
        return false;
    }
}