1、最近在做一个贷款项目是城市分站的 分为贷款前台和贷款机构后台,这个两个平台的二级域名不一样,一个前台是cityname.xx.com,cityname是会地区的不同而变化的,如在 北京就是bj.xx.com,机构后台是loan.xx.com,在机构登录的时候 ,如果把登录信息放在session,会有一个问题,就是当切换到前台的时候,由于域名改变了,此时session就会改变,之前session保存的信 息就不存在了,也就是session跨域问题,最后想到了使用缓存才存储在线用户信息,这样就不存在session跨域的问题。
2、ehCache介绍
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
下图是 Ehcache 在应用程序中的位置:
ehCache+spring的简单实用
主要的特性有:
1. 快速.
2. 简单.
3. 多种缓存策略
4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
5. 缓存数据会在虚拟机重启的过程中写入磁盘
6. 可以通过RMI、可插入API等方式进行分布式缓存
7. 具有缓存和缓存管理器的侦听接口
8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
9. 提供Hibernate的缓存实现
下面说ehcache的使用
①下载??????ehcache.jar,自己去google下载地址
②随后,开始配置ehCache的属性,ehCache需要一个xml文件来设置ehCache相关的一些属性,如最大缓存数量、cache刷新的时间等等
??ehcache.xml放在你的classpath下.
<ehcache>
<!--<diskStore path="c:\\myapp\\cache"/> -->
<defaultCache
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
/>
<cache name="DEFAULT_CACHE"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300000"
timeToLiveSeconds="600000"
overflowToDisk="false"
/>
</ehcache>
<!--
1.必须要有的属性:
name: cache的名字,用来识别不同的cache,必须惟一。
maxElementsInMemory: 内存管理的缓存元素数量最大限值。
maxElementsOnDisk: 硬盘管理的缓存元素数量最大限值。默认值为0,就是没有限制。
eternal: 设定元素是否持久话。若设为true,则缓存元素不会过期。
overflowToDisk: 设定是否在内存填满的时候把数据转到磁盘上。
2.下面是一些可选属性:
timeToIdleSeconds: 设定元素在过期前空闲状态的时间,只对非持久性缓存对象有效。默认值为0,值为0意味着元素可以闲置至无限长时间。
timeToLiveSeconds: 设定元素从创建到过期的时间。其他与timeToIdleSeconds类似。
diskPersistent: 设定在虚拟机重启时是否进行磁盘存储,默认为false.(我的直觉,对于安全小型应用,宜设为true)。
diskExpiryThreadIntervalSeconds: 访问磁盘线程活动时间。
diskSpoolBufferSizeMB: 存入磁盘时的缓冲区大小,默认30MB,每个缓存都有自己的缓冲区。
memoryStoreEvictionPolicy: 元素逐出缓存规则。共有三种,Recently Used (LRU)最近最少使用,为默认。 First In First Out (FIFO),先进先出。Less Frequently Used(specified as LFU)最少使用
-->
③用spring3拦截器检查缓存中是否有用户信息
package com.woaika.loan.front.common.filter;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.woaika.loan.front.loanuser.vo.LoginOrganVo;
import com.woaika.loan.ip.IPUtil;
import com.woaika.loan.po.LoanOrgan;
public class OrgMgtInterceptor implements HandlerInterceptor {
private Logger log = Logger.getLogger(OrgMgtInterceptor.class);
private Cache ehCache;
@Resource(name="ehCache")
public void setEhCache(Cache ehCache) {
this.ehCache = ehCache;
}
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
//log.info("==============执行顺序: 3、afterCompletion================");
}
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
//log.info("==============执行顺序: 2、postHandle================");
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
// log.info("==============执行顺序: 1、preHandle================");
String ip = IPUtil.getRemortIP(request);
Element elementIp = ehCache.get(ip);
if(null==elementIp){
response.sendRedirect(com.woaika.loan.commons.constants.SiteConstant.JIGOU_URL+"/tologin");
return false;
}else{
LoginOrganVo vo =(LoginOrganVo)elementIp.getObjectValue();
if(vo!=null){
Element elementId = ehCache.get(vo.getId().toString());
if(elementId!=null){
String tempIp = (String)elementId.getObjectValue();
if(tempIp!=null && !"".equals(tempIp) && ip.equals(tempIp)){
request.setAttribute("currentOrgan", vo);
return true;
}
}else{
response.sendRedirect(com.woaika.loan.commons.constants.SiteConstant.JIGOU_URL+"/tologin");
return false;
}
}
}
return true;
/* String url=request.getRequestURL().toString();
// if(url.matches(mappingURL)){
HttpSession session = request.getSession();
LoanOrgan org = (LoanOrgan)session.getAttribute("currentOrgan");
if(org!=null){
return true;
}else{
response.sendRedirect(com.woaika.loan.commons.constants.SiteConstant.JIGOU_URL+"/tologin");
}
return false;
// }
// return true;
*/
}
}
④将ehcache进行注入的配置applicationContext-ehCache.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 引用ehCache的配置 -->
<bean id="defaultCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation">
<value>classpath:ehcache.xml</value>
</property>
</bean>
<!-- 定义ehCache的工厂,并设置所使用的Cache name -->
<bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<ref local="defaultCacheManager"/>
</property>
<property name="cacheName">
<value>DEFAULT_CACHE</value>
</property>
</bean>
</beans>
⑤登录的时候,验证用户名密码,正确放入缓存,这里只是提供一个简单的方法(用的spring的mvc)
@RequestMapping(value="/login")
public String login(String organname, String pwd, HttpServletRequest request, HttpServletResponse response){
judgmentCity.getCityInfo(request);
LoanOrgan organ = loanOrganService.login(organname, pwd);
if(organ==null){
request.setAttribute("msg", "用户名或密码错误");
return "forward:/jigou/tologin";
}else{
//将机构信息存在cache中,来进行跨域
String ip = IPUtil.getRemortIP(request);
LoginOrganVo vo = new LoginOrganVo();
vo.setId(organ.getId());
vo.setOrganname(organ.getOrganname());
Element elementip = new Element(ip, (Serializable) vo);
Element elementid = new Element(organ.getId().toString(), ip);
//Element elementvo = new Element(organ.getId().toString(), (Serializable) vo);
ehCache.put(elementip);//添加到缓存
ehCache.put(elementid);
// ehCache.put(elementvo);
//request.getSession().setAttribute("currentOrgan", organ);
return "redirect:/organmgt/index";
}
}
注销操作(用的spring的mvc):
//注销登录
@RequestMapping(value="/logout")
public String logout(HttpServletRequest request){
String ip = IPUtil.getRemortIP(request);
Element elementIp = ehCache.get(ip);
if(elementIp!=null){
LoginOrganVo vo =(LoginOrganVo)elementIp.getObjectValue();
if(vo!=null){
ehCache.remove(vo.getId());
}
}
ehCache.remove(ip);
//request.getSession().removeAttribute("currentOrgan");
return "redirect:/jigou/tologin";
}
⑥spring3拦截器的配置文件
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/organmgt/**" /><!-- 如果不配置或/*,将拦截所有的Controller -->
<bean class="com.woaika.loan.front.common.filter.OrgMgtInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
这样所有的/organmgt/开头的请求都会被拦截,在这个拦截器进行检查是否登录就可以,这里我采用的是用户客户端ip和用户id两个key存储了用户信息保证用户的唯一信。
事实上到了这里,一个简单的Spring + ehCache Framework基本完成了。
相关推荐
本篇文章将详细讲解基于Spring、SpringMVC、MyBatis、SpringSecurity、EhCache和JCaptcha这六大组件构建的Web框架。 1. **Spring**: Spring作为整个框架的核心,提供了依赖注入(DI)和面向切面编程(AOP)等特性...
整合EhCache与Spring和Hibernate非常简单,Spring提供了配置支持,使得EhCache的初始化和管理变得自动化。通过设置配置文件,可以指定哪些数据需要被缓存,以及缓存的策略,如过期时间、更新策略等。 总的来说,...
- Spring Cache提供了统一的缓存接口,使得更换缓存提供商变得简单。 - 不仅支持Ehcache,还可以集成其他缓存解决方案,如Guava Cache、Redis等。 - `@CacheConfig`注解可以全局配置缓存,而`@Cacheable`、`@...
【Spring Boot 使用 JSP 集成 Hibernate+Shiro+Ehcache 项目详解】 Spring Boot 是一个基于 Spring 框架的高度集成了多种技术的开发工具,它简化了配置过程,使得开发人员能够快速构建可运行的应用程序。在这个项目...
它提供了一个简单易用的API,可以在Java应用程序中快速集成和使用。Ehcache的主要特点包括: 1. 高性能:Ehcache使用内存作为主要存储,访问速度快。 2. 可配置性:可以设置缓存策略,如大小限制、过期时间等。 3. ...
8. slf4j-api.jar:简单日志门面,Spring Security和Ehcache可能用到的日志库。 9. logback-classic.jar:一种实现SLF4J的日志框架,用于记录系统日志。 这些jar包是构建基于Spring和Acegi Security的安全框架所...
Ehcache可以很好地与Spring集成,通过简单的配置即可实现缓存管理。 在整合这些技术时,首先需要在Spring的配置文件中定义bean,包括数据源、SqlSessionFactory(Mybatis的核心)、MapperScannerConfigurer(扫描...
5. **Ehcache 2.0**:Ehcache是一款广泛使用的内存缓存系统,用于提高应用程序的响应速度。在2.0版本中,Ehcache支持JCache(JSR 107)标准,提供了一个更稳定的缓存解决方案,可以有效地存储和检索数据,减少对...
Spring 3.2引入了对Ehcache的全面支持,通过注解使得集成变得简单且直观。 首先,我们需要添加Ehcache和Spring的相关依赖到项目中。确保你的`pom.xml`或`build.gradle`文件包含了以下依赖: ```xml <!-- Spring ...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录,极大地简化了Java开发工作。 【Ehcache】 Ehcache是一款广泛使用的Java...
- 配置Spring:在Spring配置文件中启用缓存管理器,并指定使用Ehcache。 - 使用注解:在需要缓存的方法上添加`@Cacheable`、`@CacheEvict`等注解。 **二、Spring Cache注解** 1. **@Cacheable** 此注解用于标记...
在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...
### Spring与ehcache结合使用详解 #### 一、前言 在现代软件开发中,缓存技术被广泛应用于提高应用程序的性能。其中,Spring框架因其灵活性和强大的功能,在Java领域得到了广泛应用;而ehcache作为一款高性能、...
总的来说,Spring与Ehcache的结合使用,使得开发人员可以方便快捷地在应用中实现高效的缓存管理。通过合理的配置和使用,可以大大提高系统的响应速度,降低数据库的负载,同时还能提供良好的可扩展性和维护性。
通过这个简单的Ehcache和Spring的整合demo,我们可以了解到如何在Spring应用中配置和使用Ehcache进行缓存操作。缓存不仅可以加速数据读取,减少数据库负载,还能提高系统的响应速度和用户体验。在实际开发中,可以...
Spring MVC 和 Ehcache 是两个在Java Web开发中广泛使用的开源框架。Spring MVC 是Spring框架的一部分,主要用于构建MVC(Model-View-Controller)结构的Web应用程序,而Ehcache则是一个流行的缓存解决方案,用于...
Spring 整合 EhCache 是一个常见的缓存...通过以上步骤,你可以在Spring应用中实现EhCache的简单整合,提高应用程序的性能和响应速度。在实际项目中,根据业务场景灵活运用和优化缓存策略,可以进一步提升系统效率。
Spring还提供了多种缓存实现,如 EhCache 或 Redis,开发者可以根据需求选择。 JdbcTemplate是Spring提供的一个SQL执行工具,它降低了直接操作数据库的复杂性。使用JdbcTemplate,开发者可以避免大量的JDBC模板代码...
在Spring中使用EhCache,首先需要在项目中引入EhCache的依赖,并在`pom.xml`或`build.gradle`中添加相应的依赖项。接着,在Spring的配置文件(如`applicationContext.xml`)中声明EhCache的配置: ```xml ...