redis缓存 、springboot自带缓存、rabbitmq消息、security密码加密、jwt验证


redis缓存

使用redis
    1、在pom.xml中加依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    2、解决乱码
        在config包下,加配置文件
        /**
         *  解决redis乱码
         */
        @Configuration
        public class RedisTemplateConfig {

            @Autowired
            private RedisTemplate redisTemplate;

            @Bean
            public RedisTemplate<String, Object> redisTemplate() {
                // key序列化
                redisTemplate.setKeySerializer(new StringRedisSerializer());
                //val实例化
                redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

                return redisTemplate;
            }
        }
    3、在application.yml中加配置文件
          spring:
            redis:
                host: 127.0.0.1
    4、引用redis工具
        @Autowired
	private RedisTemplate redisTemplate;
    5、实例
        public Article findById(String id) {
            //先从缓存中查询当前对象
            Article article = (Article) redisTemplate.opsForValue().get("article_" + id);
            //如果没有取到
            if(article == null){
                //从数据库中查询
                article = articleDao.findById(id).get();
                //存入到缓存中
                redisTemplate.opsForValue().set("article_" + id, article);
                //演示设置过期时间
                //redisTemplate.opsForValue().set("article_" + id, article, 10, TimeUnit.HOURS);
            }
            return article;
        }

        public void deleteById(String id) {
            redisTemplate.delete("article_" + id);
            articleDao.deleteById(id);
        }

 springboot自带缓存

    1、在启动类上加注解
        @EnableCaching
    2、(存)实例
        @Cacheable(value = "gathering", key = "#id")
        public Gathering findById(String id) {
            return gatheringDao.findById(id).get();
        }
    3、(删)实例
        @CacheEvict(value = "gathering", key = "#gathering.id")
        public void update(Gathering gathering) {
            gatheringDao.save(gathering);
        }

 rabbitmq消息

生产者:
    1、加入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
    	    <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    2、配置文件
        spring:
            rabbitmq:
                host: 127.0.0.1
    3、注入工具类
        @Autowired
	private RabbitTemplate rabbitTemplate;
     4、发送消息
        Map<String, String> map = new HashMap<>();
	map.put("mobile", mobile);
	map.put("checkcode", checkcode);
	rabbitTemplate.convertAndSend("sms", map);

消费者:
    1、加入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
    	    <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    2、配置文件
        spring:
            rabbitmq:
                host: 127.0.0.1
    3、消费消息
        @Component
        @RabbitListener(queues = "sms")
        public class SmsListener {

            @RabbitHandler
            public void executeSms(Map<String, String> map){
                System.out.println("手机号:" + map.get("mobile"));
                System.out.println("验证码:" + map.get("checkcode"));
            }
        }        

 security密码加密

 

1、加入依赖
        <dependency>
		 <groupId>org.springframework.boot</groupId>
		 <artifactId>spring-boot-starter-security</artifactId>
	 </dependency>
2、添加config配置文件
/**
 * 安全配置类
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         *  authorizeRequests所有security全注解配置实现的开端,表示开始说明需要的权限。
         *  需要的权限分两部分,第一部分是拦截的路径,第二部分是访问该路径需要的权限。
         *  antMatchers表示拦截什么路径,permitAll任何权限都可以访问,直接放行所有。
         *  anyRequest任何的请求,authenticated认证后才可访问。
         *  and().csrf().disable()固定写法,表示使csrf拦截失效。
         */

        http
                .authorizeRequests()
                .antMatchers("/**").permitAll()
                .anyRequest().authenticated()
                .and().csrf().disable();
    }
}
3、在启动类上注入bean
        @Bean
	public BCryptPasswordEncoder encoder(){
		return new BCryptPasswordEncoder();
	}
4、在业务层注入工具类
        @Autowired
	private BCryptPasswordEncoder encoder;
5、加密
        //密码加密
	user.setPassword(encoder.encode(user.getPassword()));
6、解密
        public User login(String mobile, String password) {
		User user = userDao.findByMobile(mobile);
		if(user != null && encoder.matches(password, user.getPassword())){
			return user;
		}
		return null;
	}

 jwt验证

  

1、配置文件添加
jwt:
config:
key: zhang.Mr //签名关键字(自定义)
ttl: 3600000 //失效时间
2、注入依赖
    @Autowired
    private JwtUtil jwtUtil;
3、生成令牌,并返回给前端 @PostMapping("/login") public Result login(@RequestBody Admin admin){ admin = adminService.login(admin); if(admin == null){ return new Result(false, StatusCode.LOGINERROR, "登录失败"); } // 使得前后端可以通话的操作,采用JWT来实现 // 生成令牌 String token = jwtUtil.createJWT(admin.getId(), admin.getLoginname(), "admin"); Map<String, Object> map = new HashMap<>(); map.put("token", token); map.put("role", "admin"); return new Result(true, StatusCode.OK, "登录成功", map); }
4、管理员携带令牌删除用户(配置拦截器)
4.1 先编写config
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {

@Autowired
private JwtInterceptor jwtInterceptor;

@Override
protected void addInterceptors(InterceptorRegistry registry) {
//注册拦截器要声明拦截器对象和拦截的请求
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**") //拦截所有请求
.excludePathPatterns("/**/login/**"); //该请求除外
}
}

4.2 编写拦截器
@Component
public class JwtInterceptor implements HandlerInterceptor {

@Autowired
private JwtUtil jwtUtil;

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//无论任何都放行,具体能不能操作还是在具体的操作中去判断
//拦截器只是负责把请求头中包含token的令牌进行一个解析验证
String header = request.getHeader("Authorization");
if(header!=null && !"".equals(handler)){
//如果包含有Authorization头信息,就对其进行解析
if(header.startsWith("Bearer ")){
//得到token
String token = header.substring(7);
//对令牌进行验证
try{
Claims claims = jwtUtil.parseJWT(token);
String roles = (String) claims.get("roles");
if(roles != null && roles.equals("admin")){
request.setAttribute("claims_admin", token);
}
if(roles != null && roles.equals("user")){
request.setAttribute("claims_user", token);
}
}catch (Exception e){
throw new RuntimeException("令牌不正确!");
}
}
}
return true;
}
}

4.3 业务层进行操作
public void deleteById(String id) {
String token = (String) request.getAttribute("claims_admin");
if(token == null || "".equals(token)){
throw new RuntimeException("权限不足!");
}
userDao.deleteById(id);
}

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM