创建maven web项目

创建空项目 配置jdk
在这里插入图片描述

配置maven
在这里插入图片描述
创建module
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
导入
在这里插入图片描述
显示
在这里插入图片描述
添加插件tomcat
在这里插入图片描述

创建maven web项目
在这里插入图片描述

idea 集成tomcat
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
创建spring boot项目
在这里插入图片描述
在这里插入图片描述

spring boot 整合mybatis
在这里插入图片描述
在这里插入图片描述

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root

dao层编写sql语句

@Mapper
public interface bookDao {
    @Select("select * from book where id = 2")
    public book getById(int id);
}

整合mybatis-Plus 只勾选mysql driver
在这里插入图片描述
手动导入坐标

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>

dao层只需继承BaseMapper<实体类>

@Mapper  //加上注解
public interface bookDao extends BaseMapper<book> {

}

或者配置config 扫描mapper包

@Configuration
//扫包,将此包下的接口生成代理实现类,并且注册到spring容器中
@MapperScan("com.bai.dao.mapper")
public class MybatisPlusConfig {
    //分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}



跨域配置
@Configuration
public class WebConfig  implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //跨域配置,不可设置为*,不安全, 前后端分离项目,可能域名不一致
        //本地测试 端口不一致 也算跨域
        registry.addMapping("/**").allowedOrigins("http://localhost:8080");
    }
}

mp无法进行多表查询
在resouces目录下建立与mapper目录一致的结构

整合druid
导入坐标
配置

spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root

异常捕获 创建handler包 捕获controller层的异常

//对加了@Controller注解的方法进行拦截处理 AOP的实现
@ControllerAdvice
public class AllExceptionHandler {
    //进行异常处理,处理Exception.class的异常
    @ExceptionHandler(Exception.class)
    @ResponseBody //返回json数据
    public Result doException(Exception ex){
        ex.printStackTrace();
        return Result.fail(-999,"系统异常");
    }

}

利用jwt进行加密 创建utils包

public class JWTUtils {

    private static final String jwtToken = "123456bai!@#$$";  //密钥

    public static String createToken(Long userId){
        Map<String,Object> claims = new HashMap<>();
        claims.put("userId",userId);
        JwtBuilder jwtBuilder = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
                .setClaims(claims) // body数据,要唯一,自行设置
                .setIssuedAt(new Date()) // 设置签发时间
                .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
        String token = jwtBuilder.compact();
        return token;
    }

    public static Map<String, Object> checkToken(String token){
        try {
            Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
            return (Map<String, Object>) parse.getBody();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;

    }

}

根据id可以生成一个token

 public static void main(String[] args){
        String token = JWTUtils.createToken(100L);
        System.out.println(token);
        Map<String, Object> map = JWTUtils.checkToken(token);
        System.out.println(map.get("userId"));

    }

在这里插入图片描述

整合redis 下载redis https://github.com/tporadowski/redis/releases
官网只有linux版本
在安装目录下cmd 执行

redis-server.exe redis.windows.conf



另开一个Cmd执行如下
在这里插入图片描述
存储值
在这里插入图片描述
导入坐标
在这里插入图片描述
或手动

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置yml

  redis:
    host: localhost
    port: 6379

测试

    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void set() {
        ValueOperations ops = redisTemplate.opsForValue();  //选择要存储的类型
        ops.set("age",20);



    }
    @Test
    void get() {
        ValueOperations ops = redisTemplate.opsForValue();

        Object age = ops.get("age");
        System.out.println(age);


    }

用StringRedisTemplate 可与redis 客户端保持同步

将密码用md5加密 导入依赖

       <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

若该账号存在,根据id生成token 并将该用户信息存储在redis token->信息

    private static final String slat = "mszlu!@#";
    @Autowired
    private SysUserService sysUserService;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;




  String pwd = DigestUtils.md5Hex(password + slat);
  SysUser sysUser = sysUserService.findUser(account,pwd);
   if (sysUser == null){
         return Result.fail(ErrorCode.ACCOUNT_PWD_NOT_EXIST.getCode(),ErrorCode.ACCOUNT_PWD_NOT_EXIST.getMsg());
 String token = JWTUtils.createToken(sysUser.getId());
 redisTemplate.opsForValue().set("TOKEN_"+token, JSON.toJSONString(sysUser),1, TimeUnit.DAYS);
 return Result.success(token);
 

用户登录成功后,前端返回token,根据token 从redis中取出用户信息

  Map<String, Object> map = JWTUtils.checkToken(token);
  if (map == null){
       return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
        }
   String userJson = redisTemplate.opsForValue().get("TOKEN_" + token);
   if (StringUtils.isBlank(userJson)){
         return Result.fail(ErrorCode.NO_LOGIN.getCode(),ErrorCode.NO_LOGIN.getMsg());
        }
    SysUser sysUser = JSON.parseObject(userJson, SysUser.class);

用户退出时,直接从redis中删除token即可

  redisTemplate.delete("TOKEN_"+token);
    return Result.success(null);

@Transactional 插入时 若出现错误怎 事务回滚 即插入不成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值