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?卒