spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11740字,纯文字阅读大概需要17分钟。
内容图文
上一篇: 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 源码: https://git.oschina.net/wyait/springboot1.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 系列文章:
springboot 1.5.4 集成devTools(五)
springboot 1.5.4 集成JdbcTemplate(六)
springboot 1.5.4 集成spring-Data-JPA(七)
springboot 1.5.4 整合 mybatis(十二)
springboot 1.5.4 之监控Actuator(十四)
springboot 1.5.4 整合webService(十五)
本文出自 “架构的路上” 博客,请务必保留此出处http://wyait.blog.51cto.com/12674066/1971108
原文:http://wyait.blog.51cto.com/12674066/1971108
内容总结
以上是互联网集市为您收集整理的spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)全部内容,希望文章能够帮你解决spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。