SpringSecurity异常处理增强,加入ControllerAdvice统一处理异常返回
1. 说明SpringSecurity的实现原理是过滤器,它的执行时间比SpringMVC早,因此在执行SpringSecurity相关功能(如用户登录)时是使用不到SpringMVC的统一返回处理@ContrtollerAdvice + @ExceptionHandler的组合套装的。 2. SpringSecurity 实现 @ContrtollerAdvice增强SpringSecurity想要实现@ControllerAdvice需要对其认证返回 的异常做自定义处理,并引用SpringMVC的异常处理器其思路就是在返回扩展接口中调用SpringMVC的异常解析器来解析处理,这样就衔接上了SpringMVC的扩展 示例实现如下 2.1. 引入依赖引入SpringSecurity和SpringMVC的相关依赖 12345678<dependency> <groupId>org.springframework.boot</groupId> ...
MappedStatement
MappedStatementMappedStatement 是 MyBatis 的核心元数据对象——它把一条 SQL 语句的”所有信息”封装成一个 Java 对象,供执行引擎使用。可以把它理解为:一个 <select>/<insert>/<update>/<delete> 标签(或 @Select 注解)在内存中的等价表示。 一、它”装”了什么一个 MappedStatement 实例对应 Mapper XML 里的一条 SQL,内部包含: 字段 含义 id 语句的唯一标识,格式:接口全限定名.方法名,如 com.kewen.UserMapper.selectById sqlSource 真正的 SQL 来源(DynamicSqlSource / RawSqlSource / StaticSqlSource),用来根据参数生成最终 BoundSql sqlCommandType SELECT / INSERT / UPDATE /...
MapperMethod
MapperMethod 是 MyBatis 中连接”Java 方法调用”和”SQL 执行”的桥梁——它把一次 Mapper 接口的方法调用,翻译成对 SqlSession 的具体 API 调用。 可以把它理解为:**Mapper 接口里每个方法在运行时的”执行说明书”**。 一、它在调用链中的位置12345678910111213业务代码: userMapper.selectById(1L) │ ▼MapperProxy(JDK 动态代理 InvocationHandler) │ 根据 Method 找到对应的 MapperMethod(带缓存) ▼MapperMethod.execute(sqlSession, args) ← 关键角色 │ ▼SqlSession.selectOne / insert / update / delete / selectList / ... │ ▼Executor → StatementHandler → JDBC Mapper 接口本身没有实现类,是 MapperProxy...
mybatis拦截器Interceptor无法注入spring容器问题及解决方案
说明Mybatis的插件先于spring容器的完全初始化,虽然加了@Component会被扫描加入容器管理,但是此时Mybatis的拦截器lnterceptor注入的对象是还未初始化到容器的。所以通过这种方式拿到的bean为空。 在最后分析为啥插件会先于spring容器完全初始化(不是指在容器之前初始化,是在容器加载完所有的BeanDefinition之前完成) 解决使用@Lazy注解既然先进行完全初始化,那么我们可以先不让其进行属性注入,当需要使用的时候再进行注入,这样就把注入时机延后了采用@Lazy的目的就是在第一次使用时才真正注入,加入容器时注入的是一个代理对象,因此可以解决此问题 12345678@Slf4j@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})public class...
java中执行linux命令部署前端代码
说明执行linux命令可以用Runtime来执行,但是不是很方便,而且需要做很多额外的操作,如windows的换行符等,这里采用 apache的 commons-exec 包来处理 引入依赖maven 依赖 123456<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version></dependency> 应用中使用应用中直接组装好shell语句,然后执行方法即可,方法如下 123456789101112131415161718192021222324252627282930313233/** * 执行指定命令,输出结果到指定输出流中 * * @param command 命令 * @param out 执行结果输出流 * @return 执行结果状态码:执行成功返回0 * @throws...
SpringSecurity之FormLoginConfigurer的泛型参数分析
1. FormLoginConfigurer说明SpringSecurity采用了一系列的Configurer配置来统一配置过滤器链及其中的 Bean对象配置等,通过全局共享Bean对象实现不同地方注入同一个对象FormLoginConfigurer 主要用于配置UsernamePasswordAuthenticationFilter这个过滤器,也就是默认的表单登录的过滤器 2. FormLoginConfigurer解析先说结论,FormLoginConfigurer 有一个泛型<H extendsHttpSecurityBuilder>,但是它父类AbstractAuthenticationFilterConfigurer有三个泛型, FormLoginConfigurer...
vue父组件传方法给子组件的两种方法
说明vue项目中,当组件由引用时,父组件传给子组件的值可以由两种方法实现 方法一: 父组件像传输数据一样直接传方法给子组件方法二: 利用VueComponent实例的 this.$emit()函数实现 应用方法主要在子组件,父组件主要是入参不同和函数的内容不同,search1代表第一种方法以v-bind方式传递 search2代表第二种方法以v-on方式传递 父组件 12345678<template> <!-- searchPage1 方式直接v-bind传递方法到子组件,子组件props接收 --> <!-- searchPage2 方式 v-on方式绑定到子组件,子组件 this.$emit使用 --> <search-table :searchPage1="searchUser" @searchPage2="searchUserCallback" ...
vue语法
父子组件传递子组件调用父组件的方法父组件 1234567891011<template> <auth-object @loadList="listRole"></auth-object></template><script>methods:{ listRole(params){ //...... }}</script> 子组件auth-object 123let data = {}this.$emit("loadList", params)return data 子组件获取父组件的$emit返回值应用场景:子组件调用父组件的方法并获取到父组件方法的返回值 直接使用let data = this.$emit("loadList",...
windows命令
系统命令杀死进程 12345678910netstat -ano | findstr 80 # 找到进程id,LISTENING标识的行后面为正在监听的端口 # TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14300# TCP 172.1.0.252:57910 157.148.61.140:8080 ESTABLISHED 5272# TCP [::]:8080 [::]:0 LISTENING 14300tasklist | findstr 14300 #根据端口查询程序名称,可以不要taskkill -PID 14300 -F # 强制关闭某个进程
idea配置Debug调试Vue项目
调试vue项目调试vue项目需要启动两个运行进程,按我理解一个是工程主项目,另一个是监视项目,用来监视变化 主进程 主进程就直接配置一个npm项目就可以了,或者控制台直接npm run serve启动 监视进程 在idea上配置一个java-script工程,其监视的端口为运行项目的端口,如下 然后就可以断点调试了,调试界面与idea相同 PS:但是我发现,不好调啊,为啥总是会往框架里面的代码跑,这就为难了 引用
