spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃

spring boot:从零开始搭建一个项目 - day 7 springboot devtools热加载+MybatisPlus配置+kisso从入门到放弃

一、springboot devtools热加载

最近感觉开发每次都需要重启真的太麻烦了,还是把这个开起来吧,至于同事说的这个吃内存,吃就吃吧,效率赛高!!!
(热加载:实时编译修改代码,虽然有事没事就会自己加载一个=。=)

1、引入配置
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

<build>中需要启动一项配置,如下:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--// fork :  如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>
2、idea配置

在这里插入图片描述
在这里插入图片描述

3、运行项目

在这里插入图片描述
控制台这样提示即可

在这里插入图片描述

二、MybatisPlus配置

之前匆匆配置了MybatisPlus,今天偶然之下看到了官网中的配置,感觉自己真的太随意了,之前从Mybatis转Plus的时候就光顾着感慨这玩意儿太好使了!发现自己配的好像不太灵光就,,,看了下配置。嘿,目前的功力还看不太明白源码。

mybatis-plus:
  configuration:
    #是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射。
    mapUnderscoreToCamelCase: true
    #MyBatis 自动映射策略,通过该配置可指定 MyBatis 是否并且如何来自动映射数据表字段与对象的属性
    autoMappingBehavior: full
    #MyBatis 自动映射时未知列或未知属性处理策略,通过该配置可指定 MyBatis 在自动映射过程中遇到未知列或者未知属性时如何处理
    autoMappingUnknownColumnBehavior: none
    #指定当结果集中值为 null 的时候是否调用映射对象的 Setter(Map 对象时为 put)方法,通常运用于有 Map.keySet() 依赖或 null 值初始化的情况。
    callSettersOnNulls: true

  global-config:
    #是否控制台 print mybatis-plus 的 LOGO  //丑拒,完全不知道意义何在
    banner: false
    #***是否初始化 SqlRunner(com.baomidou.mybatisplus.extension.toolkit.SqlRunner)
    enable-sql-runner: false
    #全局配置
    db-config:
      #全局默认主键类型
      id-type: ASSIGN_ID
      #逻辑删除字段
      logic-delete-field: removed
      #逻辑未删除值
      logic-not-delete-value: 1
      #逻辑已删除值
      logic-delete-value: 0

enable-sql-runner这个配置默认就是false,百度了一下看到一句话挺有意思:通过mybatis SqlRunner 执行sql语句,mybatis拦截器拦截不到,所以控制台也就不会打印sql语句
稍微跟了下去看了源码,一直报错,网上文档也找不到怎么用,标个星下次一定叭。

三、kisso

这两天琢磨着怎么写一个单点登录验证,在研究MybatisPlus配置的时候,鼠标不经意地滑过这里,当时就感觉自己又发现了一个宝藏呢,MybatisPlus这么好用这个大概……嘿嘿
一看介绍

kisso = cookie sso 基于 Cookie 的 SSO 中间件,它是一把快速开发 java Web 登录系统(SSO)的瑞士军刀。

可以啊!基于Cookie意味着可以不用部署缓存了……吧?反正先用着嘿嘿
在这里插入图片描述
然后根据地址跳转了过去想下个案例康一康,心怀激动地解压了N次之后发现没有动静,打开一看,缓缓打出一个?,,,?,,,,?????
在这里插入图片描述

一、惯例先引包
        <!-- kisso 登陆验证 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>kisso</artifactId>
            <version>3.7.6</version>
        </dependency>
二、添加拦截器

官方案例是这样的

@ControllerAdvice
@Configuration
public class WebConfig extends WebServiceConfigurer {
    
    

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
        // SSO 授权拦截器
        SSOSpringInterceptor ssoInterceptor = new SSOSpringInterceptor();
        ssoInterceptor.setHandlerInterceptor(new LoginHandlerInterceptor());
        registry.addInterceptor(ssoInterceptor).addPathPatterns("/**").excludePathPatterns("/v1/sso/**");
    }
}

这个案例,我也不知道作者是少传了包还是我太菜了。WebServiceConfigurer 这个父类就纠结了半天,似乎并没有这个类?new LoginHandlerInterceptor()这个new的对象也是个自建对象?
……
……
……
等心平气和之后思考了一下,不就是拦截器么?spring boot中直接继承WebMvcConfigurationSupport不就可以了?点开SSOSpringInterceptor 对象,里面的代码就是个标准的拦截器结构,看到其中定义了一个属性:

private SSOHandlerInterceptor handlerInterceptor;

那只要新建个LoginHandlerInterceptor实现SSOHandlerInterceptor 即可。LoginHandlerInterceptor中实现了两个方法:

public class LoginHandlerInterceptor implements SSOHandlerInterceptor {
    
    
    @Override
    public boolean preTokenIsNullAjax(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
    
    
        return false;
    }

    @Override
    public boolean preTokenIsNull(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
    
    
        return false;
    }
}

SSOHandlerInterceptor 对象中,存在这么一段代码,说明了LoginHandlerInterceptor中实现的两个方法的作用:

if (HttpUtil.isAjax(request)) {
    
    
    this.getHandlerInterceptor().preTokenIsNullAjax(request, response);
    return false;
}

if (this.getHandlerInterceptor().preTokenIsNull(request, response)) {
    
    
    log.debug("logout. request url:" + request.getRequestURL());
    SSOHelper.clearRedirectLogin(request, response);
}

以下属于盲猜:
1、preTokenIsNullAjax方法是前端使用ajax提交方式,且获得的token为空时触发的数据处理返回;
2、preTokenIsNull方法是前端除使用ajax提交方式调用,且获得的token为空时,重定向到登陆页面;

三、配置说明

此配置可在项目配置文件中写入

    /**
     * 编码格式,默认 UTF-8
     */
    private String encoding = SSOConstants.ENCODING;
    /**
     * 签名密钥(用于对此算法)
     */
    private String signKey;
    /**
     * 签名算法
     *
     * @see io.jsonwebtoken.SignatureAlgorithm
     */
    private String signAlgorithm = "HS512";
    /**
     * RSA 私钥 key.jks 存储路径
     */
    private String rsaJksStore = "key.jks";
    /**
     * RSA 公钥 public.cert 存储路径
     */
    private String rsaCertStore = "public.cert";
    /**
     * RSA 密钥 Alias
     */
    private String rsaAlias = "jwtkey";
    /**
     * RSA 密钥 keypass
     */
    private String rsaKeypass = "llTs1p68K";
    /**
     * RSA 密钥 storepass
     */
    private String rsaStorepass = "lLt66Y8L321";
    /**
     * 访问票据名
     */
    private String accessTokenName = "accessToken";
    /**
     * cookie 名称
     */
    private String cookieName = "uid";
    /**
     * cookie 所在有效域名,不设置为当前访问域名
     */
    private String cookieDomain;
    /**
     * cookie 路径
     */
    private String cookiePath = "/";
    /**
     * cookie 是否设置安全,设置 true 那么只能为 https 协议访问
     */
    private boolean cookieSecure = false;
    /**
     * cookie 是否为只读状态,设置 js 无法获取
     */
    private boolean cookieHttpOnly = true;
    /**
     * cookie 有效期 -1 关闭浏览器失效
     */
    private int cookieMaxAge = -1;
    /**
     * 是否验证 cookie 设置时浏览器信息
     */
    private boolean cookieBrowser = false;
    /**
     * 是否验证 cookie 设置时 IP 信息
     */
    private boolean cookieCheckIp = false;
    /**
     * 登录地址
     */
    private String loginUrl = "";
    /**
     * 退出地址
     */
    private String logoutUrl = "";
    /**
     * 登录成功回调地址
     */
    private String paramReturnUrl = "ReturnURL";
    /**
     * 缓存有效期设置
     */
    private int cacheExpires = CookieHelper.CLEAR_BROWSER_IS_CLOSED;
    /**
     * 访问票据
     */
    private SSOToken ssoToken;

    /**
     * 权限认证(默认 false)
     */
    private boolean permissionUri = false;

    /**
     * 插件列表
     */
    private List<SSOPlugin> pluginList;
    /**
     * SSO 缓存
     */
    private SSOCache cache;
    /**
     * SSO 权限授权
     */
    private SSOAuthorization authorization;
四、写个login试试
/**
     * 登录
     * @param wxUser
     * @return
     */
    @ApiOperation(value = "登陆系统", notes = "登陆系统")
    @PostMapping("/loginSys")
    @Login(action = Action.Skip)
    public Result loginSys(@RequestBody WxUser wxUser, HttpServletRequest request, HttpServletResponse response){
    
    
        // 生成 jwt 票据,访问请求头设置‘ accessToken=票据内容 ’
        String jwtToken = SSOToken.create().setId(wxUser.getAvatarUrl()).setIssuer(wxUser.getNickName()).getToken();

        //解析票据
        SSOToken ssoToken = SSOToken.parser(jwtToken);

        // Cookie 模式设置
        SSOHelper.setCookie(request, response, ssoToken);

        return Result.success(jwtToken);
    }

    /**
     * 登录
     * @param wxUser
     * @return
     */
    @ApiOperation(value = "获取用户测试", notes = "获取用户测试")
    @PostMapping("/getUserTest")
    @Login(action = Action.Normal)
    public Result getUserTest(@RequestBody WxUser wxUser, HttpServletRequest request){
    
    
        // 解析票据
        SSOToken ssoToken = SSOHelper.getSSOToken(request);

        return new Result(ssoToken);
    }

参数:
在这里插入图片描述
先执行loginSys后执行getUserTest
在这里插入图片描述
可以看到直接使用 SSOHelper.getSSOToken(request)即可生成代码

今天就先到这里吧,其实还有挺多想验证的,下次用到了再议……再议……
PS:听说小程序不能使用Cookie?卒

猜你喜欢

转载自blog.csdn.net/qq_16253859/article/details/106343019