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

简介:

1      Spring Boot整合redis和缓存

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

 

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

 

1pom文件导入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

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

@Autowired

   privateStringRedisTemplate stringRedisTemplate;

 

   @RequestMapping("/setRedis")

   @ResponseBody

   publicString setRedis() {

      //保存字符串

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

      return"ok";

   }

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

wKioL1ncTBiz_9n0AAAFwaJh7rs146.png


通过上面这段极为简单的测试案例演示了如何通过自动配置的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";

   }

启动,测试:

wKiom1ncu02yIUPeAAAOKR2zFWk496.png

 

解决redis中保存keyvalue乱码问题:

/**

     * 设置数据存入 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也可以自定义valuejson格式,参考博客:

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

 

在工程里面路径是这样:

wKiom1ncu1_B-I5mAADxl0xABV8982.png

 

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

 

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

 

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

 

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

 

wKioL1ncTGWhM-8mAADPINici20744.png

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

接管Spring BootWeb配置

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

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

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

自定义资源映射addResourceHandlers

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

/**

 *

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

 * @类名称:MyWebMvcConfig

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

 * @创建人:wyait

 * @创建时间:2017630上午8:48:33

 * @version

 */

@Configuration

public class MyWebMvcConfigextends WebMvcConfigurerAdapter {

   @Override

   publicvoid addResourceHandlers(ResourceHandlerRegistry registry) {

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

           "/images/");

      super.addResourceHandlers(registry);

   }

}

静态资源存放路径:

wKioL1ncTG6wPZIuAABZq30zIZI403.png

 

通过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方法即可达到效果了

wKioL1ncTIPw-Go7AAE6sdwGC9k047.png

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

 



本文转自 wyait 51CTO博客,原文链接:http://blog.51cto.com/wyait/1971108,如需转载请自行联系原作者

相关文章
|
9月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
9月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
9月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2845 0
|
8月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
670 5
|
8月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
8月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
603 4
|
9月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1590 5
|
9月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
781 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
9月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
468 0
探索Spring Boot的@Conditional注解的上下文配置
|
10月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1505 10

热门文章

最新文章