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>

160527、项目上线后session(远程session)的更多相关文章

  1. 项目上线后出现Bug,该如何处理?

    项目在上线之后又出现了Bug,这让很多测试人员和开发人员头痛.但很多时候线上Bug普遍地存在,不可避免. 任何项目都存在未发现 Bug  和 已发现 Bug  两种情况,不存在没有 Bug的情况. 即 ...

  2. 如何保证前端项目上线后的安全?webfunny已总结前端最关键的12大指标

    实时监控大屏   众所周知:实时流量大屏,是用来监控前端项目上线质量的. 如大家所知,监控系统会监控线上应用的各项指标,如:错误.白屏.耗时等等,但是仔细一想,即使有这些监控,我们也不一定能够保证线上 ...

  3. 项目、地铁/公交、游戏签到、项目上线后发现新bug该怎么处理

    项目:1.提前分配好业务(每个人该干什么 )2.提前召开会议3.提前挑好人4.准备项目思维导图5.提前审阅项目6.为确保项目按期交付 把控好时间7.给员工提前打好招呼 (提醒加班)8.建立好安全机制9 ...

  4. 记一次项目上线后Log4j2不输出日志的坑

        公司项目采用了Log4j2来输出日志,在开发环境和测试环境下均可以输出日志,但在生成环境就没有日志输出.开始毫无头绪,后来通过不断的排查,终于解决了这个问题.在此记录下该问题的解决过程,便于后 ...

  5. laravel5 项目上线后务必将开发环境更改为生产环境

    如果以开发环境上线,出错信息将全通过json暴露出来了,屏蔽方式如下: .env 文件设置如下APP_ENV=productionAPP_DEBUG=false 改完设置后把缓存清理一遍 如果更改后清 ...

  6. Vue项目上线后刷新报错404问题(apache,nginx,tomcat)

    转自:https://www.cnblogs.com/sxshaolong/p/10219527.html 很简单,需要 服务器端 加个配置文件,然后 重启服务就好了,记住一定要 重启服务,否则无效!

  7. 项目上线后,遇到IE浏览器不显示大部分组件的问题

    document.addEventListener('touchmove',(evt)=>{ }) 以上是ES6 语法,箭头函数,当然在IE下是不行的啦. 所以改为:ES5语法 document ...

  8. 修改记录-优化后(springboot+shiro+session+redis+ngnix共享)

    1.普通用户实现redis共享session 1.配置 #cache指定缓存类型 spring.cache.type=REDIS #data-redis spring.redis.database=1 ...

  9. MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题

    ///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...

随机推荐

  1. atitit.thumb生成高质量缩略图 php .net c++ java

    atitit.java thumb生成高质量缩略图 php .net c++ 1. 图像缩放(image scaling)---平滑度(smoothness)和清晰度(sharpness) 1 2.  ...

  2. atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml

    atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml 1. yaml是个好的选择.. 1 2. 数据的层次结构--结构:hash,list,和block  ...

  3. Atitit.ide代码块折叠插件 eclipse

    Atitit.ide代码块折叠插件 eclipse 1. User Defined Regions  #region  ...  #endregion  插件com.cb.eclipse.foldin ...

  4. 每日英语:Rethinking How We Watch TV

    To understand how much television could soon change, it helps to visit an Intel Corp. division here ...

  5. mysql学习笔记2--mysql的基本使用

    4. 运行和关闭MySQL服务器 首先检查MySQL服务器正在运行与否.在资源管理器查看有没有mysqld的进程,如果MySQL正在运行,那么会看到列出来的 mysqld 进程.如果服务器没有运行,那 ...

  6. Oracle拉出在sqlserver建表的语句

    我们将Oracle数据同步到sqlserver时,是先得在sqlserver端建表的. 复杂的字段我们不同步,就仅仅考虑以下四种数据类型. Oracle到SQLServer做的映射: int -> ...

  7. Entity Framework(五):使用配置伙伴创建数据库

    在上一篇文章中讲了如何使用fluent API来创建数据表,不知道你有没有注意到一个问题.上面的OnModelCreating方法中,我们只配置了一个类Product,也许代码不是很多,但也不算很少, ...

  8. golang Time to String

    golang Time to String allenhaozi · 2016-09-02 09:00:00 · 2447 次点击 · 预计阅读时间 1 分钟 · 19分钟之前 开始浏览 这是一个创建 ...

  9. c配置库ccl使用小结

    配置文件为key=value键值对形式 下载与安装 库文件下载:ccl-0.1.1.tar.gz 安装:  tar -zxvf ccl-0.1.1.tar.gz  cd ccl-0.1.1 ./con ...

  10. QWidget切换

    QWidget切换,参考类:QstackedLayout,QStackedWidget,QTabWidget 一.Tab出现的位置 tabWidget.setTabPosition(QTabWidge ...