Springboot知识2

1.在yml中查看生效和失效的自动配置类在yml文件中debug=true.

2.yml中加单引号会将\n作为字符串输出,双引号会将\n作为换行输出

3.springMVC之中返回字符表示页面跳转,在响应体当中加入responbody表示作为响应体返回

在类中加上,表示整个都作为响应体

4.@Restcontriller相当于@Responbody加@controller

5.

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

该代码表示运行将springboot程序打包成一个项目进行的一个插件

6.依赖冲突:一般出现ClassNotfind、方法找不到, 安装mavenHelper插件,点击pom文件,点击DependencecyAnalyer查看confilcts冲突的依赖,查看是否有爆红的依赖,进行exclusion

7.自己指定相关依赖可以根据加入<version>版本号<version>,官方的依赖的版本号已经指定,非官方的版本号需要我们必须去手动的去指定相关的版本

8.yml文件当中驼峰命名和**-**一样的效果

yml集合表示

list: 
 - sang
 - geng
students:
 -name: sanggeng
  gge:18
 -name: caotang
  age:12

9yml.占位符表示¥{port}

10.springboot读取yml文件

@Value注解:表示读取简单的值 @Value(${字段})---加了@Value的类必须嫁给容器管理

@ConfigurationProperties表示读取对象的配置

将实体类交给容器在容器上加上@ConfigurationProperties(prefix+"yml种文件对象的名称")

spring-boot-configuration-processor加入这个依赖可以对yml文件做出响应的提示信息

11.整合junit(添加依赖)

测试的包目录结构不同,整合junit在@springBootTest(class=......Application.class)

yml种注释用#

12.整合mybatis

a.引入mybatis启动器依赖和mysql驱动器依赖指定版本号参考官网

b.配置数据库的连接,mybatis的相关

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.example.hxds.dr.db.pojo  #配置那个包下的类有 默认的别名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true

13.springboot项目下的静态资源放在resources下的static目录

14.设置请求头

    @RequestMapping(value = "/testConsumes",method = RequestMethod.POST,consumes = "multipart/from-data")
    public String testConsumes(){
        System.out.println("testConsumes处理了请求");
        return "/success.jsp";
    }

15.路径参数@Pathvariable

16.前端传入集合参数:[{"":""},{"":""}]

17.如果需要使用@RequestBody来获取请求体中Json并且进行转换,要求请求头 Content-Type 的值要为: application/json 。

18.

如果接口的参数是使用QueryString的格式的话,我们也可以使用SpringMVC快速获取参数。

我们可以使用@RequestParam来获取QueryString格式的参数。

在方法中定义方法参数,方法参数名要和请求参数名一致,这种情况下我们可以省略@RequestParam注解。

    @RequestMapping("/testRquestParam")
    public String testRquestParam(Integer id, String name, String[] likes){
        System.out.println("testRquestParam");
        System.out.println(id);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "/success.jsp";
    }

如果方法参数名和请求参数名不一致,我们可以加上@RequestParam注解例如:

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam("id") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "/success.jsp";
    }

也可以将参数封装成一个对象接收

19.required

代表是否必须,默认值为true也就是必须要有对应的参数。如果没有就会报错。

如果对应的参数可传可不传则可以把去设置为fasle

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam(value = "id",required = false) Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "/success.jsp";
    }

如果对应的参数没有,我们可以用defaultValue属性设置默认值。

    @RequestMapping("/testRquestParam")
    public String testRquestParam(@RequestParam(value = "id",required = false,defaultValue = "777") Integer uid,@RequestParam("name") String name, @RequestParam("likes")String[] likes){
        System.out.println("testRquestParam");
        System.out.println(uid);
        System.out.println(name);
        System.out.println(Arrays.toString(likes));
        return "/success.jsp";
    }

19.返回的数据大括号表示的是一个对象,中括号表示的是集合数组对象。

出现XMLHttpRequest可能是出现了跨域问题

20.解决跨域问题

a.在类上加注解@crossOrigin,该类的所有方法都可以跨域(比较麻烦)

b.常用的方式

@Configuration
public class CorsConfig implements WebMvcConfigurer {


   /* @Value("${custom.file-path.save.parent}")
    private String path;*/

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //设置允许跨域的的路径
        registry.addMapping("/**")
                //设置允许跨域请求的域名
                .allowedOriginPatterns("*")
                //设置允许的请求方式
                .allowedHeaders("*")
                //设置允许的请求方式
                .allowedMethods("*")
                //是否允许cookie
                .allowCredentials(true)
                //设置允许跨域的时间
                .maxAge(3600);
    }
}

 21.登录接口可以在用户登录成功之后返回一个token。用户访问接口的时候将token传过来

jwt工具类的生成,依赖的导入

<dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.0</version>
            </dependency>
package com.myblog.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * JWT工具类
 */
public class JwtUtil {

    //有效期为
    public static final Long JWT_TTL = 24*60 * 60 *1000L;// 60 * 60 *1000  一个小时
    //设置秘钥明文
    public static final String JWT_KEY = "sangeng";

    public static String getUUID(){
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }
    
    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject) {
        JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
        return builder.compact();
    }

    /**
     * 生成jtw
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)              //唯一的ID
                .setSubject(subject)   // 主题  可以是JSON数据
                .setIssuer("sg")     // 签发者
                .setIssuedAt(now)      // 签发时间
                .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
        return builder.compact();
    }

    public static void main(String[] args) throws Exception {
        String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJjYWM2ZDVhZi1mNjVlLTQ0MDAtYjcxMi0zYWEwOGIyOTIwYjQiLCJzdWIiOiJzZyIsImlzcyI6InNnIiwiaWF0IjoxNjM4MTA2NzEyLCJleHAiOjE2MzgxMTAzMTJ9.JVsSbkP94wuczb4QryQbAke3ysBDIL5ou8fWsbt_ebg";
        Claims claims = parseJWT(token);
        System.out.println(claims);
    }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey() {
        byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }
    
    /**
     * 解析
     *
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws Exception {
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }


}

22.配置拦截器的步骤

a.

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        if (!StringUtils.hasText(token)) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }


        return true;
    }
}

b.

@Configuration
public class LoginConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)//添加拦截器
                .addPathPatterns("/**")//配置拦截路径
                .excludePathPatterns("/user/login");//配置排除路径
    }
}

23.统一异常的处理

@ControllerAdvice
@ResponseBody
public class MyControllerAdvice {

    @ExceptionHandler(RuntimeException.class)
    public ApiResult handerException(Exception e) {
        String message = e.getMessage();
        ApiResult<Object> result = new ApiResult<>(300, message, null);
        return result;
    }
}

24.获取原生的request和respon对象HttpServletRequest,HttpServletResponse,HttpSession,只需要在在方法上直接获取即可。

25自定义参数解析(从请求头中获取参数)

@RestController
@ResponseBody
public class UserController {

    
    @GetMapping
    public void getUser(@CurrentUserId String id) {
        System.out.println();
    }
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUserId {

}
@Component
public class UserIdResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUserId.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String token = webRequest.getHeader("token");
        return token;
    }
}

26.springboot中事务直接使用注解@Transactional

27.springboot中的aop

a。添加依赖

b.创建接口和切面类

c.方法上添加定义的aop注解

28.模版引擎的使用(类似jsp)

a.导入依赖

b. 环境配置:

29.环境切换

a。编写不同环境下的yml配置文件

b。在主要的yml中的进行配置spring-profiles-active

30.springboot开启打印日志

debug: true
logging:
  level:
    com.honson: debug

31.springboot指标监控

a.引入依赖:

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

访问接口查看信息

图形化界面的信息查看可以使用相关依赖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值