跨域
跨域是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域。
SpringMVC中解决跨域:1、在Controller方法上使用@CrossOrigin注解;
2、先自定义一个类WebMvcConfig implements WebMvcConfigurer;然后重写接口中的方法addCorsMappings。
@Configuration public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
}
3、在正式环境中,是在网关中有配置。譬如在nginx中可以配置跨域
登录流程
动态码
后端生成4位数字,然后使用awt生成一个图片的BufferedImage,然后ImageIO.write转换为ByteArrayOutputStream,然后用Base64Encoder转为base64串返回。
在后端,使用redis存储(hash),prefix(常量)+telNum作为key,生成的4位数字为value,设置过期时间300s。(手机号是前端传过来的,用户先填了姓名手机号,再点获取动态码)
在后续发送短信时,用户名、手机号和动态码一起传入。
验证码
首先前端会做限制,但后端接口也会做限流,首先@Limit复用系统中原有的,使用MySQL实现的互斥锁,来保证60秒内,只有一个线程能获取到资源id(姓名+手机号)。@Limit里面有两重校验,一重是互斥锁,另一重是动态码校验是否正确,以判断是否是这个人!
生成的手机验证码同样用redis(hash)来存储,登陆时校验会用到。
自定义注解
采用的是注解(接口上面注解上@Target(Method)、@Retention(Runtime))+ AOP切面(@Aspect、@annotation标注前面注解接口的全限定类名、@Around注解里是要扩充的方法)实现的。
@Around方法里,就读取注解的方法,注解方法里的参数,然后@Limit注解里面可以传入过期时间、要读取的参数这些。
分布式锁
就用MySQL实现的乐观锁的分布式锁。
分布式Session
这个使用Redis来实现的。是用在登录login的时候。
第一次登陆时setLoginVO,然后用JWT.Builder()来生产jwtToken,设置加密算法HS256、过期时间等。
然后将jwtToken写入Cookie中,Cookie中需要设置一些内容很重要:setDomain域名oap-local.mucfc.com、setPath路径/(@Value注解从properties文件中读取)、setMaxAge2小时、setHttpOnly Cookie只能在服务器端修改,客户端都拿不到。
然后解析
登录
在登陆controller方法里,一方面去查库里有没有这个人,手机验证码有没有,就能通过。
通过后,要保存登录信息:首先在session中setAttribute放入用户的一些信息;然后根据id、sid、name生成一个jwt的token,然后把token、域名、路径、是否httpOnly等信息放入Cookie中,把cookie放入response中。
登录状态保持
请求request里的cookies(request.getCookies),遍历看有没有name是我们上一步生成cookies时设置的常量。有就返回cookie的value,之前设置的就是token。然后解析token,拿到id。(Jwt.parse,会获取一个claims的数组)。拿到id后去缓存拿一个loginVO,有效就能拿到,没效就拿不到。
其实登录时首先会跳到一个tempLogin的页面,在这里判断用户的登录状态,以及用户的入职状态。如果用户没有登陆态,就跳转到登录页面;如果有,直接跳转到信息采集页面。
JWTtoken的刷新问题,过了3小时怎么办??拿不到登录状态返回什么,直接返回null吗??
Mybatis
MyBatis分页
(一)物理分页和逻辑分页
(二)PageHelper的原理
这篇文章对PageHelper的执行逐步debug,比较清晰 blog.csdn.net/qq_21996541…
(三)Mybatis插件——责任链和动态代理
www.cnblogs.com/homejim/p/1… 、www.cnblogs.com/homejim/p/9… 、www.cnblogs.com/homejim/p/1…
Mybatis缓存
Mybatis面试题
没事看一看也没坏处,大部分都要针对单个问题细看。
Maven
版本冲突
这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖于X的1.0还是2.0版本呢?
这就看Classloader的加载顺序了,假设Classloader先加载X_1.0,而它就不会再加载X_2.0了,如果A恰恰希望使用X_2.0呢,血案就这样不期而遇了。
Maven面试题
Maven面试题 www.bjpowernode.com/hot/537.htm…
SpringBoot
Spring和SpringBoot的联系和区别
Spring框架是实现了IOC、AOP这两项核心编程思想,主要作用是Java开发的一个框架。
SpringBoot是一个快速开发的Spring框架,是的Spring项目的启动、开发和配置都变得更简单。提供自动配置?起步依赖starter等功能,简化开发。
SpringBoot原理
SpringBoot与Maven
SpringBoot面试题
SpringBoot面试题 juejin.cn/post/684490…