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");
}
}