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

  • 一、springboot devtools热加载
    • 1、引入配置
    • 2、idea配置
    • 3、运行项目
  • 二、MybatisPlus配置
  • 三、kisso
    • 一、惯例先引包
    • 二、添加拦截器
    • 三、配置说明
    • 四、写个login试试

一、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: trueglobal-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 {@Overridepublic 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 {@Overridepublic boolean preTokenIsNullAjax(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {return false;}@Overridepublic 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?卒

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

  1. spring boot:从零开始搭建一个项目 - day 5 Mybatis plus代码自动生成器

    spring boot:从零开始搭建一个项目 - day 5 Mybatis plus代码自动生成器 一.Mybatis plus代码自动生成器 1.引入配置 2.创建Controller 3.执行m ...

  2. spring boot:从零开始搭建一个项目 - day 4 控制台输出日志美化 + swagger2

    spring boot:从零开始搭建一个项目 - day 4 控制台输出日志美化 + swagger2 一.logback.xml配置日志美化 二.集成swagger2 1.引入依赖 2.编写配置文件 ...

  3. spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证

    锻炼不就是为了吃更多好吃的吗 --刚去完健身房然后开了包薯片=-= spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证 一.生成token 二.重写拦截器 咳,书接上 ...

  4. spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法

    spring boot启动类启动 错误: 找不到或无法加载主类 xxx.xxxx.Application 的解决方法 导入的一个外部的spring boot项目,运行启动类,忽然提示找不到或者无法加载 ...

  5. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  6. java dagger2_从零开始搭建一个项目(rxJava+Retrofit+Dagger2) ---上

    工程结构 Androd studio 替代eclipse给我带来最大的感觉,就是不用每次需要用到什么类库,就得去网上下载一个jar包.只要在项目app/build.gradle中加入代码,就能远程使用 ...

  7. spring boot 踩坑日记: 错误: 找不到或无法加载主类 xxx.xxx.xxx

    错误信息: 错误: 找不到或无法加载主类 io.sr.SrDhTraApplication 解决: 在pom.xm文件中指明启动类位置: 代码: <configuration><fo ...

  8. java dagger2_从零开始搭建一个项目(rxJava+Retrofit+Dagger2) --完结篇

    鸡汤:感到迷茫是因为你没有给自己做好人生规划 接上一章的内容,如果还没看过的朋友, 请点 本章内容 Dagger2的引入 Dagger2的引入 Dagger2是一个依赖注入框架,那么dagger2能起 ...

  9. 从零开始搭建一个项目-前端框架(vue)

    基础框架:Vue UI框架:iview 样式:less 用到模块:vuex vue-router Ajax:anios 第一步 安装淘宝镜像代替npm(可省略,如果省略了,后面所有cnpm改为npm) ...

最新文章

  1. 不断的困惑:为什么我仍然使用JavaScript函数语句
  2. MySQL原生密码认证
  3. class ts 扩展方法_一些让程序保持可扩展的 TypeScript 技巧
  4. Winform中实现简单的登录成功后跳转到主页面的逻辑
  5. Android自定义View研究(四) -- 在XML中定义View
  6. Java基础知识(二)之控制语句
  7. .NET6之MiniAPI(十七):缓存
  8. [Hei.Captcha] Asp.Net Core 跨平台验证码实现
  9. python敏感字替换_python用类实现文章敏感词的过滤方法示例
  10. 动易php,动易数据转成dedecms的php程序
  11. springboot entity date_「Java」 - SpringBoot amp; JPA多数据源
  12. Java中private、protected、public和default的区别
  13. abi-api, arm target triplet https://en.wikipedia.org/wiki/ARM_architecture
  14. 精品资源:40个实用的 PSD 贴纸模板《下篇》
  15. 修复SQL Server 2016年Microsoft.AnalysisServices.AdomdClientUI.dll程序集错误的前4个选项
  16. php mysqli分页,PHP使用Mysqli类库实现完美分页效果的方法_PHP
  17. [最小割][Kruskal] Luogu P5039 最小生成树
  18. Builder 设计模式 +lomok @Data @Builder @Builder.default
  19. linux版本i686,在Ubuntu中'i686'是什么意思? - Ubuntu问答
  20. (苹果Mac OSX系统)绿联USB无法连接网络解决方案

热门文章

  1. C++常用数学运算(待完结)
  2. 认真做好你的时间管理
  3. 摩尔庄园手游服务器链接不稳定,摩尔庄园手游
  4. 暴走大侠找不到服务器了,暴走大侠bug大全 bug汇总介绍[多图]
  5. wex5全局变量教程2021-11-14
  6. matlab数据分析之脸谱图,MATLAB数据记录、分析和可视化:在MATLAB上绘制DHT11传感器读数...
  7. linux怎么进行多行注释
  8. [徐州.12.4的一次会议]:知识图谱
  9. 短期均线上穿长期均线原理
  10. html连接手机与电视,电视可以连接手机看电视吗