resume

166 阅读4分钟

跨域

跨域是由浏览器的同源策略造成的,是浏览器对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分页

(一)物理分页和逻辑分页

image.png

image.png

(二)PageHelper的原理

这篇文章对PageHelper的执行逐步debug,比较清晰 blog.csdn.net/qq_21996541…

image.png

(三)Mybatis插件——责任链和动态代理

www.cnblogs.com/homejim/p/1…www.cnblogs.com/homejim/p/9…www.cnblogs.com/homejim/p/1…

Mybatis缓存

tech.meituan.com/2018/01/19/…

image.png

image.png

image.png

image.png

image.png

segmentfault.com/a/119000003…

Mybatis面试题

没事看一看也没坏处,大部分都要针对单个问题细看。

xie.infoq.cn/article/fde…

www.modb.pro/db/97924

Maven

版本冲突

www.cnblogs.com/aspirant/p/…

这里有一个需要特别注意的,即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呢,血案就这样不期而遇了。

image.png

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…