前后端自学笔记

前后端自学笔记,第1张

前后端自学笔记 JavaWeb 依赖包 mysql驱动 (注意需要去掉runtime,否则报错)

 mysql
 mysql-connector-java

高性能缓存组件
 本地缓存

 com.google.guava
 guava
 19.0

跨域身份验证解决⽅案 Json web token包


 io.jsonwebtoken
 jjwt
 0.7.0

通⽤⼯具包

 org.apache.commons
 commons-lang3
 3.9
 
mybaits依赖

 org.mybatis.spring.boot
 mybatis-spring-boot-starter
 2.1.2
 
热部署
  
 org.springframework.boot 
 spring-boot-devtools 
 true 
 
 
打包时用的
 
 
 
 org.springframework.boot
 spring-boot-maven-plugin
     
 
 true
 
     
 
 
 

热部署还需要如下设置(配置完后重启idea即可生效)

21年以前版本设置:

使⽤快捷键打开,选择Registry

注意默认快捷键:
 window快捷键 Shift+Ctrl+Alt+/
 mac快捷键 Shift+Command+Alt+/

选择compiler.automake.allow.when.app.running ,重启idea就⾏!!!

配置文件 数据库配置
server.port=8080
#==============================数据库相关配置========================================
spring.datasource.driver-class-name =com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xiaodi?
useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
#使⽤阿⾥巴巴druid数据源,默认使⽤⾃带的
#spring.datasource.type =com.alibaba.druid.pool.DruidDataSource
#开启控制台打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# mybatis 下划线转驼峰配置,两者都可以
#mybatis.configuration.mapUnderscoreToCamelCase=true
mybatis.configuration.map-underscore-to-camel-case=true
#配置扫描
mybatis.mapper-locations=classpath:mapper
    //只返回状态码
    public static JsonData buildSuccess(){
    return new JsonData(0,null,null);
    }
    public static JsonData buildSuccess(Object data){
        return new JsonData(0,data,null);
    }
    //返回数据
    public static JsonData buildSuccess(Object data,String msg){
        return new JsonData(0,data,msg);
    }

    
    //自定义错误信息
    public static JsonData buildError(String msg){
        return new JsonData(-1,null,msg);
    }
    //自定义状态码 和错误信息
    public static JsonData buildError(Integer code,String msg){
        return new JsonData(code,null,msg);
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

JWTUtils工具
public class JWTUtils {
    
    private static final long EXPIRE=6000*60*24*7;
    
    private static final String SECRET="Liang";
    
    private static final String TOKEN_PREFIX="feng";
    
    private static final String SUBJECT="liang";

    
    public static String geneJsonWebToken(User user){
        String token=Jwts.builder().setSubject(SUBJECT)
                .claim("name",user.getName()) //把用户信息传入token中
                .claim("head_img",user.getHeadImg())
                .claim("phone",user.getPhone())
                .claim("id",user.getId())
                .setIssuedAt(new Date()) //设置下发时间
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRE)) //设置过期时间
                .signWith(SignatureAlgorithm.HS256,SECRET) //设置签名方式
                .compact();
        return token=TOKEN_PREFIX+token;
    }

    
    public static Claims checkJWT(String token){
        try {
            final Claims claims=Jwts.parser()
                                .setSigningKey(SECRET)
                                .parseClaimsJws(token.replace(TOKEN_PREFIX,""))
                                .getBody();
            return claims;
        } catch (Exception e) {
            return null;
        }
    }
拦截器
//连接这个接口
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            String token = request.getHeader("token");
            if(token==null){
                token = request.getParameter("token");
            }
            if(StringUtils.isNotBlank(token)){
            Claims claims = JWTUtils.checkJWT(token);
            if(claims == null){
                //TODO 登录失败 给前端的提示
                sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
                return false;
            }
            Integer id = (Integer) claims.get("id");
            String name =(String) claims.get("name");
            //返回给前端的信息
            request.setAttribute("user_id",id);
            request.setAttribute("name",name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        sendJsonMessage(response, JsonData.buildError("登录过期,重新登录"));
        return false;
    }

    
    public static void sendJsonMessage(HttpServletResponse response,Object obj){
        try {
            ObjectMapper objectMapper = new ObjectMapper();//序列化json
            response.setContentType("application/json;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.print(objectMapper.writevalueAsString(obj));
            writer.close();
            response.flushBuffer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
在config层的配置    

@Configuration
    //连接这个接口
public class InterceptorConfig implements WebMvcConfigurer {
    @Bean
    LoginInterceptor loginInterceptor(){
        return new LoginInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/v1/pri**");//设置拦截路径  注意斜杠一定要加!!!
        //.excludePathPatterns("/api/v1/pri/user/login","/api/v1/pri/user/register");//拦截路径中   不拦截哪些路径
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}
注意事项 springBoot在线配置

在构建项目时要记得添加
controller层
@RestController
@RequestMapping("/api/v1/video")
service层
@service
mapper层可以在主方法设置mapper路径
@MapperScan("com.liang.WebTest.mapper")
@RequestParam(value = "video_id",required = true) 方法中要填参数 添加这个注解  设置为必填选项
@Param("video_id") 在mapper层  参数设置一个名称 利于mybatis映射   
@JsonProperty  把属性名序列化成另一个名称 起别名  @JsonProperty("video_id")
    										private Integer videoId; 
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 设置日期格式
三表关联查询