上一篇:spring boot 1.5.4 整合webService(十五)

1      Spring Boot整合redis和缓存

Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。

redis官网:https://redis.io/

redis中文社区:http://www.redis.cn/

1.1  集成redis

项目spring-boot-jsp源码:

spring-boot相关项目源码:

码云地址:https://git.oschina.net/wyait/springboot1.5.4.git

github地址:https://github.com/wyait/spring-boot-1.5.4.git

1,pom文件导入redis依赖

<dependency>

<!--导入redis依赖 -->

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-redis</artifactId>

<version>1.3.0.RELEASE</version>

</dependency>

2,更改配置文件application

# Redis数据库索引(默认为0)

spring.redis.database=0

# Redis服务器地址

spring.redis.host=192.168.10.100

# Redis服务器连接端口

spring.redis.port=6379

# Redis服务器连接密码(默认为空)

spring.redis.password=

# 连接池最大连接数(使用负值表示没有限制)

spring.redis.pool.max-active=10

# 连接池最大阻塞等待时间(使用负值表示没有限制)

spring.redis.pool.max-wait=-1

# 连接池中的最大空闲连接

spring.redis.pool.max-idle=8

# 连接池中的最小空闲连接

spring.redis.pool.min-idle=0

# 连接超时时间(毫秒)

spring.redis.timeout=0

其中spring.redis.database的配置通常使用0即可,Redis在配置的时候可以设置数据库数量,默认为16,可以理解为数据库的schema

3,CatController中新增方法,向redis中设置基本类型数据:

@Autowired

privateStringRedisTemplate stringRedisTemplate;

@RequestMapping("/setRedis")

@ResponseBody

publicString setRedis() {

//保存字符串

stringRedisTemplate.opsForValue().set("token:aaa","111");

return"ok";

}

4,启动,访问,redis工具查看,已经设置成功!

通过上面这段极为简单的测试案例演示了如何通过自动配置的StringRedisTemplate对象进行Redis的读写操作,该对象从命名中就可注意到支持的是String类型。如果有使用过spring-data-redis的开发者一定熟悉RedisTemplate<K, V>接口,StringRedisTemplate就相当于RedisTemplate<String,String>的实现。

除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer<T>接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。

redis中保存引用类型数据

,比如cat对象:

1,自定义RedisConfig/RedisService/HashService。参考相关文件

2,编写Controller

@Autowired

privateRedisService redisService;

@RequestMapping("/setCatRedis")

@ResponseBody

publicString setRedis() {

try{

Catcat = new Cat("小黑", 5);

redisService.set("token:cat1",cat, 5000L);

Catc = new Cat("小花", 6);

redisService.set("token:cat2",c, 5000L);

return"ok";

}catch (Exception e) {

e.printStackTrace();

}

return"fail";

}

启动,测试:

解决redis中保存key和value乱码问题:

/**

* 设置数据存入 redis 的序列化方式

*

* @param redisTemplate

* @param factory

*/

private voidinitDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate,RedisConnectionFactory factory) {

//StringRedisSerializer解决key中午乱码问题。//Long类型不可以会出现异常信息;

redisTemplate.setKeySerializer(newStringRedisSerializer());

redisTemplate.setHashKeySerializer(newStringRedisSerializer());

redisTemplate.setHashValueSerializer(newJdkSerializationRedisSerializer());

//value乱码问题:GenericJackson2JsonRedisSerializer

//redisTemplate.setValueSerializer(newJdkSerializationRedisSerializer());

redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

redisTemplate.setConnectionFactory(factory);

}

GenericJackson2JsonRedisSerializer也可以自定义value的json格式,参考博客:

https://my.oschina.net/superwen/blog/885879

2      Spring Boot添加过滤器、拦截器和监听器

主要就是两步:

§  1,创建我们自己的拦截器类并实现 HandlerInterceptor 接口

§  2,其实重写WebMvcConfigurerAdapter中的addInterceptors方法把自定义的拦截器类添加进来即可

内容如下:

spring boot过滤器和拦截器 demo

项目mybatis-spring-boot 源码:https://git.oschina.net/wyait/springboot1.5.4.git

2.1  拦截器

@WebServlet

public class ActionInterceptorimplements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequestrequest, HttpServletResponse response, Object handler)

throws Exception {

// System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");

// 获取系统时间

Calendar ca = Calendar.getInstance();

int hour =ca.get(Calendar.HOUR_OF_DAY);

// 设置限制运行时间 0-4点

if (hour < 4) {

return true;

}

return false;

}

@Override

public void postHandle(HttpServletRequestrequest, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throwsException {

//System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");

}

@Override

public voidafterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler, Exception ex)

throws Exception {

// System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet

// 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");

}

}

拦截器使用:  关于注解我使用的是@Component 其实也可能声明成配置

@Component

public class ApplicationConfigextends WebMvcConfigurerAdapter {

@Override

public voidaddInterceptors(InterceptorRegistry registry) {

// 多个拦截器组成一个拦截器链

// addPathPatterns 用于添加拦截规则

// excludePathPatterns 用户排除拦截

registry.addInterceptor(newActionInterceptor()).addPathPatterns("/service/extract/json/**");

super.addInterceptors(registry);

}

}

2.2  过滤器

定义:

public class ActionFilter implements Filter {

@Override

public void init(FilterConfig filterConfig)throws ServletException {

}

@Override

public void doFilter(ServletRequestrequest, ServletResponse response, FilterChain chain)

throws IOException,ServletException {

// 获取系统时间

Calendar ca = Calendar.getInstance();

int hour =ca.get(Calendar.HOUR_OF_DAY);

// 设置限制运行时间 0-4点

if (hour < 4) {

HttpServletResponse httpResponse =(HttpServletResponse) response;

httpResponse.setCharacterEncoding("UTF-8");

httpResponse.setContentType("application/json;charset=utf-8");

// 消息

Map<String, Object>messageMap = new HashMap<>();

messageMap.put("status","1");

messageMap.put("message","此接口可以请求时间为:0-4点");

ObjectMapper objectMapper=newObjectMapper();

String writeValueAsString =objectMapper.writeValueAsString(messageMap);

response.getWriter().write(writeValueAsString);

} else {

chain.doFilter(request, response);

}

}

@Override

public void destroy() {

}

}

使用:

@Component

public class ApplicationConfig {

@Bean

@Order(1)//过滤器执行顺序(优先:小到大)

public FilterRegistrationBean  filterRegistrationBean() {

FilterRegistrationBean registrationBean= new FilterRegistrationBean();

ActionFilter actionFilter = newActionFilter();

registrationBean.setFilter(actionFilter);

List<String> urlPatterns = newArrayList<String>();

urlPatterns.add("/service/extract/json/*");

registrationBean.setUrlPatterns(urlPatterns);

return registrationBean;

}

}

2.3  监听器

监听器(Listener)的注入配置方法和Servlet 一样,有两种方式:代码注入或者注解注入配置

2.3.1    代码注入方式【推荐】

通过代码方式注入过滤器

  • @Configuration配置类中添加bean:

@Bean

public ServletListenerRegistrationBeanservletListenerRegistrationBean(){

ServletListenerRegistrationBeanservletListenerRegistrationBean = new ServletListenerRegistrationBean();

servletListenerRegistrationBean.setListener(new IndexListener());

return servletListenerRegistrationBean;

}

  • 监听器实体IndexListener.Java类:

package com.example.Listener;

importjavax.servlet.ServletContextEvent;

importjavax.servlet.ServletContextListener;

public class IndexListenerimplements ServletContextListener{

@Override

public void contextDestroyed(ServletContextEventarg0) {

System.out.println("IndexListenercontextDestroyed method");

}

@Override

public voidcontextInitialized(ServletContextEvent arg0) {

System.out.println("IndexListenercontextInitialized method");

}

}

2.3.2    注解方式

  • 通过注解方式注入监听器

IndexListener2.Java类

package com.example.Listener;

importjavax.servlet.ServletContextEvent;

importjavax.servlet.ServletContextListener;

importjavax.servlet.annotation.WebListener;

@WebListener

public class IndexListener2implements ServletContextListener{

@Override

public voidcontextDestroyed(ServletContextEvent arg0) {

System.out.println("IndexListener2contextDestroyed method");

}

@Override

public void contextInitialized(ServletContextEventarg0) {

System.out.println("IndexListener2contextInitialized method");

}

}

  • 把注解加到入口处启动即可

@SpringBootApplication

@ServletComponentScan

public classSpringBootSimpleApplication {

public static void main(String[] args) {

SpringApplication.run(SpringBootSimpleApplication.class, args);

}

}

3      spring boot静态资源配置

前言

本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter。

正文

前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持,今天详细的来介绍下默认的支持,以及自定义扩展如何实现。

默认资源映射

Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性。

建议大家使用Spring Boot的默认配置方式,提供的静态资源映射如下:

  • classpath:/META-INF/resources

  • classpath:/resources

  • classpath:/static

  • classpath:/public

在工程里面路径是这样:

上面这几个都是静态资源的映射路径,优先级顺序为:META-INF/resources > resources >static > public

大家可以自己在上面4个路径下都放一张同名的图片,访问一下即可验证。

还有,你可以随机在上面一个路径下面放上index.html,当我们访问应用根目录http://lcoalhost:8080时,会直接映射到index.html页面。

对应的配置文件配置如下:

我们可以通过修改spring.mvc.static-path-pattern来修改默认的映射,例如我改成/wyait/**,那运行的时候访问http://lcoalhost:8080/wyait /index.html 才对应到index.html页面。

接管Spring Boot的Web配置

如果Spring Boot提供的Sping MVC不符合要求,则可以通过一个配置类(注解有@Configuration的类)加上@EnableWebMvc注解来实现完全自己控制的MVC配置。

当然,通常情况下,Spring Boot的自动配置是符合我们大多数需求的。在你既需要保留Spring Boot提供的便利,有需要增加自己的额外的配置的时候,可以定义一个配置类并继承WebMvcConfigurerAdapter,无需使用@EnableWebMvc注解。

这里我们提到这个WebMvcConfigurerAdapter这个类,重写这个类中的方法可以让我们增加额外的配置,这里我们就介绍几个常用的。

自定义资源映射addResourceHandlers

比如,我们想自定义静态资源映射目录的话,只需重写addResourceHandlers方法即可

/**

*

* @项目名称:mybatis-spring-boot

* @类名称:MyWebMvcConfig

* @类描述:自定义静态资源映射路径和静态资源存放路径

* @创建人:wyait

* @创建时间:2017年6月30日上午8:48:33

* @version:

*/

@Configuration

public class MyWebMvcConfigextends WebMvcConfigurerAdapter {

@Override

publicvoid addResourceHandlers(ResourceHandlerRegistry registry) {

registry.addResourceHandler("/images/**").addResourceLocations(

"/images/");

super.addResourceHandlers(registry);

}

}

静态资源存放路径:

通过addResourceHandler添加映射路径,然后通过addResourceLocations来指定路径。我们访问自定义/images文件夹中的logo_t.png 图片的地址为http://127.0.0.1:8080/images/logo_t.png

如果你想指定外部的目录也很简单,直接addResourceLocations指定即可,代码如下:

@Configuration

public class MyWebMvcConfigextends WebMvcConfigurerAdapter {

@Override

publicvoid addResourceHandlers(ResourceHandlerRegistry registry) {

//    registry.addResourceHandler("/images/**").addResourceLocations(

//         "/images/");

registry.addResourceHandler("/images/**").addResourceLocations(

"file:D:/images/");

super.addResourceHandlers(registry);

}

}

addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径

页面跳转addViewControllers

以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了

值的指出的是,在这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着我们自己的配置和Spring Boot的自动配置同时有效,这也是我们推荐添加自己的MVC配置的方式。

项目源码:https://git.oschina.net/wyait/springboot1.5.4.git

spring boot系列文章:

spring boot 1.5.4 概述(一)

spring boot 1.5.4 入门和原理(二)

spring boot 1.5.4 之web开发(三)

spring boot 1.5.4 整合JSP(四)

spring boot 1.5.4 集成devTools(五)

spring boot 1.5.4 集成JdbcTemplate(六)

spring boot 1.5.4 集成spring-Data-JPA(七)

spring boot 1.5.4 配置文件详解(八)

spring boot 1.5.4 统一异常处理(九)

spring boot 1.5.4 定时任务和异步调用(十)

spring boot 1.5.4 整合log4j2(十一)

spring boot 1.5.4 整合 mybatis(十二)

spring boot 1.5.4 整合 druid(十三)

spring boot 1.5.4 之监控Actuator(十四)

spring boot 1.5.4 整合webService(十五)

spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)

spring boot 1.5.4 整合rabbitMQ(十七)

spring boot 1.5.4 集成Swagger2构建Restful API(十八)

spring boot 1.5.9 整合redis(十九)

转载于:https://blog.51cto.com/wyait/1971108

spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)相关推荐

  1. java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序

    本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者. 同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解 拦截器,过滤器,监听器执行顺序(被拦截个人过 ...

  2. 拦截器 过滤器 监听器 的区别

    面试的时候突然被问了这么个问题 本来知道点啥的 脑子一热 啥也没说出来总结一下 以下内容均摘自网络 但是 读完之后 应该会对它们有更清晰的认识.1.1 什么是拦截器: 拦截器,在AOP(Aspect- ...

  3. java中拦截器 过滤器 监听器都有什么区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts2的action进行业务逻辑,比如过滤掉非法u ...

  4. Java拦截器,过滤器,监听器(三大器)对比

    https://blog.csdn.net/baidu_20876831/article/details/80405515

  5. spring boot 1.5.4 整合 mybatis(十二)

    上一篇:spring boot 1.5.4 整合log4j2(十一) Spring Boot集成Mybatis 更多更详细的配置参考文件:application.properties和<Spri ...

  6. 响应式久草编程基础教程:久草Spring Boot 与 Lettuce 在线整合

    本文主要介绍响应式编程访问 Redis,以及 Spring Boot 与 Lettuce 的整合使用. Lettuce 是可扩展性线程安全的 Redis 客户端,用于同步.异步和响应式使用.如果多个线 ...

  7. Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理

    Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 参考文章: (1)Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 ( ...

  8. Spring Boot Cache使用与整合

    参考: 史上最全的Spring Boot Cache使用与整合 Spring Cache扩展:注解失效时间+主动刷新缓存 项目地址 使用本地Caffeine缓存 引入依赖包 <dependenc ...

  9. mybatis 配置_配置Mybatis在Spring Boot工程中的整合

    配置Mybatis在Spring Boot工程中的整合包,设置mybatis的实体类别名,输出执行sql语句配置项. 分析: 添加启动器依赖: 配置Mybatis:实体类别名包,日志,映射文件等: 配 ...

最新文章

  1. 15个超实用的php正则表达式
  2. layout_weight layout_gravity gravity
  3. html path属性,HTML Location pathname用法及代码示例
  4. 释放囚犯(洛谷-P1622)
  5. 草稿 9203 作业重点关注
  6. 双层PDFmaker
  7. 英文IT电子书下载:www.foxebook.net
  8. 美国最好的计算机工程专业排名,2017年美国大学排名之计算机工程专业排名TOP100...
  9. 基于CST电磁仿真软件的7-10GHz的微带带通滤波器的设计
  10. 装配uwsgi和nginx rabbitMQ
  11. 用php做一个相册的程序,搭建自己的相册 50个免费的相册程序(上)
  12. 百度“文心一言”首批生态合作伙伴公布,Moka接入打造人力资源数字化人AI服务
  13. 设备指纹之安全性详解
  14. 记录一次Anaconda安装Spyder失败及解决方法
  15. 40个笑到抽筋的神回复,绝了!
  16. python sort是什么排序_python的sort()排序方法
  17. C语言beep中有什么作用,C++中发声函数Beep用法
  18. 十六进制转换浮点型时大小端问题
  19. r语言boxcox异方差_如何检测异方差并纠正它?
  20. 聚划算火拼如何参团 聚划算火拼效果怎么样

热门文章

  1. poj 3260 The Fewest Coins(多重背包+完全背包)
  2. 关于Web端-UI自动化测试
  3. y空间兑换代码_进行图像增广的15+种功能总结和Python代码实现
  4. linux内存和flash区别,嵌入式Linux概念NOR/NAND Flash的差别
  5. 想学人工智能从哪入手?
  6. Web前端现在薪资多少?企业喜欢什么样的Web前端工程师?
  7. 【Java 网络编程】网络通信原理、TCP、UDP 回显服务
  8. java 锁定界面_Java中的锁
  9. python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明的示例代码...
  10. Python_软件安装