ETJava Beta | Java    注册   登录
  • Springboot整合Redis

    发表于 2025-02-03 21:46:14     阅读(90)     博客类别:Springboot

    Springboot整合Redis

    使用Springboot整合SpringDataRedis客户端
    SpringDataRedis客户端相比自己封装Jedis简单很多
    

    1. 添加依赖

            <!--redis依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <!-- 连接池依赖 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
            </dependency>
            <!--jackson 依赖-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>

    2. 编写RedisConfig

    /*
    配置RedisTimplte的序列化器
    */
    
    package com.etjava.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.RedisSerializer;
    
    @Configuration
    public class RedisConfig {
    
        /*
        * RedisConnectionFactory 连接工厂 由Spring容器直接注入即可
        * */
        @Bean
        public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
            // 创建RedisTemplate对象
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            // 设置连接工厂
            template.setConnectionFactory(redisConnectionFactory);
            // 设置key的序列化方式 String类型的key和Hash类型的key
            template.setKeySerializer(RedisSerializer.string());
            template.setHashKeySerializer(RedisSerializer.string());
            // 创建JSON序列化工具
            GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
            // 设置value的序列化 String类型和Hash类型
            template.setValueSerializer(jsonRedisSerializer);
            template.setHashValueSerializer(jsonRedisSerializer);
            return template;
        }
    }
    

    3. Controller中使用

    package com.etjava.controller;
    
    
    
    import com.etjava.entity.Access;
    import com.etjava.entity.User;
    import com.etjava.service.AccessService;
    import com.etjava.service.UserService;
    import com.etjava.util.IPUtil;
    import com.etjava.util.MailUtil;
    import com.qq.connect.QQConnectException;
    import com.qq.connect.api.OpenID;
    import com.qq.connect.api.qzone.UserInfo;
    import com.qq.connect.javabeans.AccessToken;
    import com.qq.connect.javabeans.qzone.UserInfoBean;
    import com.qq.connect.oauth.Oauth;
    import net.sf.json.JSONObject;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 首页请求
     */
    @Controller
    public class IndexController {
    
        @Autowired
        private HttpServletRequest request;
    
        @Autowired
        private RedisTemplate<String,Object> redisTemplate;
    
        @Autowired
        private UserService userService;
    
        @Autowired
        private AccessService accessService;
    
        @Value("${authorizeCode}")
        private String sysAuthorizeCode;
    
        @Autowired
        private MailUtil mailUtil;
    
    
    
        // 请求首页
        @RequestMapping("/")
        public ModelAndView index(){
            // 测试Redis添加数据
            redisTemplate.opsForValue().set("index","访问首页");
            ModelAndView mav = new ModelAndView();
            Access access = accessService.findByFunName("index");
            if(access.getIsAccess()==1 && access.getAccessTime().compareTo(new Date())>0){
                mav.setViewName("index");
            }else{
                mav.setViewName("noPermission");
            }
            return mav;
        }
    
    }
    

    4. 拦截器中注入RedisTemplate

    拦截器中注入需要注意的是配置拦截器时 应先实例化自定义拦截器Bean 否则拦截器中注入的Bean为null

    4.1 自定义拦截器

    package com.etjava.config;
    
    import com.etjava.entity.SysAccess;
    import com.etjava.entity.SysLogs;
    import com.etjava.service.SysAccessService;
    import com.etjava.service.SysLogsService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    import org.springframework.util.StringUtils;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.HandlerMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.text.SimpleDateFormat;
    import java.util.*;
    import java.util.stream.Collectors;
    
    
    /*TODO: 自定义拦截器*/
    @Component
    public class MyInterceptor implements HandlerInterceptor {
    
        private SysAccessService sysAccessService;
        private SysLogsService sysLogsService;
    
        private Integer enableLogs = 0; // 是否开启日志记录 0表示不开启
    
        private SimpleDateFormat sdf4 =  new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
    
        // 注入RedisTemplate
        @Autowired
        private RedisTemplate<String,Object> redisTemplate;
    
        // 在请求处理之前进行调用(Controller方法调用之前)
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    
            
            return true; // 如果返回false,则停止流程,api不会被调用
        }
    
        // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
            
        }
    
        // 在整个请求结束之后调用,也就是在DispatcherServlet渲染了视图执行
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
            System.out.println("After Completion");
        }
    
    
      
    }

    2. Spring的配置类中开启拦截器

    package com.etjava.config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * web相关的配置类
     * 例如 虚拟路径映射等
     */
    @Configuration
    public class WebAppConfig implements WebMvcConfigurer {
    
        @Value("${carouselImages}")
        private String carouselImages;
        @Value("${courseImages}")
        private String courseImages;
        @Value("${teacherImages}")
        private String teacherImages;
        @Value("${systemImages}")
        private String systemImages;
        @Value("${articleImages}")
        private String articleImages;
        @Value("${userImages}")
        private String userImages;
    
        @Value("${crawlerImages}")
        private String crawlerImages;
    
        @Value("${frameworkIndexLogPaths}")
        private String frameworkIndexImages;
    
        /**
         * 虚拟路径映射
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/carouselImages/**").
                    addResourceLocations(carouselImages); // 轮转图片映射
            registry.addResourceHandler("/courseImages/**").
                    addResourceLocations(courseImages);  // 课程帖子图片映射
            registry.addResourceHandler("/teacherImages/**").
                    addResourceLocations(teacherImages);  //  讲师图片映射
            registry.addResourceHandler("/systemImages/**").
                    addResourceLocations(systemImages);  // 系统图片映射
            registry.addResourceHandler("/articleImages/**").
                    addResourceLocations(articleImages);  // 自定义帖子图片
            registry.addResourceHandler("/userImages/**")
                    .addResourceLocations(userImages); // 用户头像
    
            registry.addResourceHandler("/frameworkIndexImages/**")
                    .addResourceLocations(frameworkIndexImages); // API首页图片虚拟地址映射
    
       
        }
    
    
    
        // 实例化MyInterceptor Bean
        @Bean
        public MyInterceptor getMyInterceptor(){
            return new MyInterceptor();
        }
        /*注册拦截器*/
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(getMyInterceptor()) // 引用实例化后的Bean 不可以直接new MyInterceptor() 否则拦截器中的注入的Bean为null
                    .addPathPatterns("/**");
    //                .excludePathPatterns("/login");
        }
    }