zoukankan      html  css  js  c++  java
  • 160527、项目上线后session(远程session)

    import java.io.Serializable;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.UUID;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import com.danga.MemCached.MemCachedClient;
    /**
     * 远程Session存放在Memcached缓存服务器里的Session
     */
    public class CacheSessionProvider implements SessionProvider{
        @Autowired
        private MemCachedClient memCachedClient;
        private int expiry = 30;//分钟
        private static final String  JSESSIONID = "JSESSIONID";
        //放值
        @Override
        public void setAttribute(HttpServletRequest request,HttpServletResponse response, String name,
                Serializable value) {
    /*        HttpSession session = request.getSession();//true    Cookie JSESSIONID
            session.setAttribute(name, value);  */
                  //本地有一份
                 //另一份Memcached
            Map<String,Serializable> session = new HashMap<String,Serializable>();
            session.put(name, value);
            //保存远程了
            memCachedClient.set(getSessionId(request,response), session, expiry*60);
        }
        //取值
        @SuppressWarnings("unchecked")
        @Override
        public Serializable getAttribute(HttpServletRequest request,HttpServletResponse response, String name) {
            Map<String,Serializable> session = (Map<String, Serializable>) memCachedClient.get(getSessionId(request,response));
            if(null != session){
                return session.get(name);
            }
            return null;
        }
        @Override
        public void logout(HttpServletRequest request,HttpServletResponse response) {
            // TODO Auto-generated method stub
            if(memCachedClient.keyExists(getSessionId(request, response))){
                memCachedClient.delete(getSessionId(request, response));
            }
            //清理Cookie
            
        }
        @Override
        public String getSessionId(HttpServletRequest request,HttpServletResponse response) {
            //所有的Cookie
            Cookie[] cookies = request.getCookies();
            if(null != cookies && cookies.length > 0){
                for(Cookie c : cookies){
                    if(JSESSIONID.equals(c.getName())){
                        return c.getValue();
                    }
                }
            }
            //生成一个
            String sessionId = UUID.randomUUID().toString().replaceAll("-", "");
            Cookie cookie = new Cookie(JSESSIONID,sessionId);
            cookie.setMaxAge(-1);
            cookie.setPath("/");
            response.addCookie(cookie);
            return sessionId;
        }
        public void setExpiry(int expiry) {
            this.expiry = expiry;
        }
    }
    注意:平时开发的时候是本地session,上线后放在缓存里面,所以将httpsession缓存了cachesession。spring的配置文件中加上<bean id="sessionProvider" class="cn.itcast.common.web.session.CacheSessionProvider">
            <property name="expiry" value="60"/>
        </bean>

  • 相关阅读:
    UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
    SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
    洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
    HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模
    HDU 3183.A Magic Lamp-区间找最小值-RMQ(ST)
    HDU 1231.最大连续子序列-dp+位置标记
    牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂
    CodeForce-811B Vladik and Complicated Book(水题)
    POJ1426——Find The Multiple (简单搜索+取余)
    POJ——3278 Catch That Cow(BFS队列)
  • 原文地址:https://www.cnblogs.com/zrbfree/p/5545716.html
Copyright © 2011-2022 走看看