用ehcache代替session

    在网页的保存访问状态我们一般都会用到Session和Cookie,这里也不想多说Session和Cookie之间的特点和区别。最近在看到一个xxx网站,说他们网站没有用Session,当时我就很纳闷,他们是如何实现回话状态和用户登录状态的保存。

这里我就分享一下自己完成该过程的思路:
    Session的原理:其实Session的使用就默认使用了一个Cookie,比如JAVA中常见的jsessionid这个 Cookie,Session的会话就是基于该Cookie的。Session就是一个对象集内存,jsessionid就代表该对象的ID,由于 jsessionid是不变的,所以当无状态的http访问的时候就会传输该jsessionid值,服务器就通过该jsessionid在内存中找的原 来的对象,所以就可以保持回话的状态。虽说不用Session,但还是要用Cookie。
    我们就会思考,如何当访问用户量巨大,session保持时间30分钟,这样保持Session的内存就会大大的增加,JRE本来的内存就很有限,所以就有人开始不用默认的session这个很方便的回话管理机制。
    ehcache是缓存中的一个奇葩,它把二级缓存做到很经典,内存和硬盘存储两者的结合就增大了我们内存的需求。这里ehcache也不多说,因为我也没有深入的去看过,皮毛。
这里先对ehcache.xml做一个session的配置:


<!– 主要记录session 把原来的session存入二级缓存总 –>
<cache name=”session”
maxEntriesLocalHeap=”1000″
eternal=”false”
overflowToDisk=”true”
timeToIdleSeconds=”1800″
timeToLiveSeconds=”1800″
/>

这里开启的超时设置,30分钟的对象过期时间,在内存中保存1000个对象,超过1000个对象就保存在硬盘中。现在就查考session中的方法自己编写对应的方法。
private final String fullyQualifiedName = “session”;
@Override
public void setAttribute(String name, Object value)
{

EhCacheEngine.add(fullyQualifiedName, name, value);
}

@Override
public void removeAttribute(String name)
{
EhCacheEngine.remove(fullyQualifiedName, name);
}

@Override
public Object getAttribute(String name)
{
return EhCacheEngine.get(fullyQualifiedName, name);
}

这里的EhCacheEngine是一个Ehcache的自己封装的一个类。
    完成了配置的类的创建,那我们如何实现session的回话,上面我们说过session会自动产生一个jsessionid保存在COOKIE中,那我 们就按照这个思路生产一个自己的cookie,只是每个访问用户的保存值不一样,不如账号+密码做摘要加密(xxx_id)。每次接受http请求的时候觉得该 cookie的值,在存储对象setAttribute(String name, Object value)时name就设置这个cookie的值,在取对象getAttribute(String name)时name也是cookie的值,使用存储使用的name是一样,对象就不会发生变化,这样就实现的回话。
    如果在过程中用不到来的session,当然客户端就不会产生jsessionid这个cookie,也是不如jsp,struts等的使用会自动生成,但我们没有使用就不



<Context docBase="yi18" path="/yi18" reloadable="true"  
 sessionCookieName="session_id" />
这样jsessionid就变成session_id(Tomcat6和tomcat7下有效),这样就伪装的我们的后台程序。




你可能感兴趣的:(用ehcache代替session)