• 我们先看看他接受前端发来的登录实体类里面的属性是什么

public class LoginBody

{

/**

  • 用户名

*/

private String username;

/**

  • 用户密码

*/

private String password;

/**

  • 验证码

*/

private String code;

/**

  • 唯一标识

*/

private String uuid = “”;

…//省略get/set()方法

}

  • 发现他有用到验证码和uuid

  • 然后我们打断点,输入账号密码验证码发个请求看看

image-20210419204503002

  • 阿昌发现一个问题,在实体类中没有定义uuid,为什么他就生成了uuid的值,看样子是随机生成的

  • 想到之前有验证码的请求,于是我们去看看验证码的请求

image-20210419204602830

  • 通过上面同样的方法快速定位到/captchaImage 接口的位置

@RestController

public class CaptchaController

{

@Resource(name = “captchaProducer”)

private Producer captchaProducer;

@Resource(name = “captchaProducerMath”)

private Producer captchaProducerMath;

@Autowired

private RedisCache redisCache;

// 验证码类型

@Value(“${ruoyi.captchaType}”)

private String captchaType;

/**

  • 生成验证码

*/

@GetMapping(“/captchaImage”)

public AjaxResult getCode(HttpServletResponse response) throws IOException

{

// 保存验证码信息

String uuid = IdUtils.simpleUUID();

String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;

String capStr = null, code = null;

BufferedImage image = null;

// 生成验证码

if (“math”.equals(captchaType))

{

String capText = captchaProducerMath.createText();

capStr = capText.substring(0, capText.lastIndexOf(“@”));

code = capText.substring(capText.lastIndexOf(“@”) + 1);

image = captchaProducerMath.createImage(capStr);

}

else if (“char”.equals(captchaType))

{

capStr = code = captchaProducer.createText();

image = captchaProducer.createImage(capStr);

}

redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);

// 转换流信息写出

FastByteArrayOutputStream os = new FastByteArrayOutputStream();

try

{

ImageIO.write(image, “jpg”, os);

}

catch (IOException e)

{

return AjaxResult.error(e.getMessage());

}

AjaxResult ajax = AjaxResult.success();

ajax.put(“uuid”, uuid);

ajax.put(“img”, Base64.encode(os.toByteArray()));

return ajax;

}

}

  • 代码如上,发现他的验证码类型可以更换,他读取的是配置文件中的值,我们去配置文件中看

image-20210419204914668

image-20210419204951402


  • 验证码生成的使用

image-20210419205055752

  • 我们打个debug断点看看验证码的情况

image-20210419205403424

image-20210419205528869

  • 我们点进去看看redisCache他是怎么写的,他封装了redisTemplete,向redis存值

image-20210419205621259


  • 到这里知道了uuid是在验证码的请求中生成的,那他为什么在/login登入请求就自带了?????

  • 阿昌就去看了看前端部分,找到这个前端的页面

image-20210419205827160


  • 发现他在created()生命周期就调用了getCode()函数,我猜就是获取验证码的函数

image-20210419210051089

  • 我们看看getCodeImg() js脚本是什么样子的,来源在/src/api/login.js里面

image-20210419210119209

image-20210419210148517


  • 跟阿昌想的一样,他就是获取验证码的js脚本

image-20210419210241569

到此我们就知道了他前端请求了后端的验证码接口,并给对象赋值,所以前端就显示了图片验证码,然后验证码的谜底就储存在redis中,我们就继续向下走


  • 既然我们在看前端了,那我们就继续看前面

image-20210419210604102


  • 我们向下看,发现我们上面进入这个页面就会调getCode()方法,然后点击验证码也会调用getCode()方法

image-20210419210659145


  • 我们先看到登录请求的前端js脚本

image-20210419211019851


  • 回到后端,打上断点,输入账号密码,查看debug

image-20210419211247609

  • 他执行了login方法,我们进去看看

image-20210419211604677


image-20210419211814191

在这里插入图片描述

  • 最后生成token↑

image-20210419212054119

image-20210419212129028

image-20210419212326546

  • 阿昌发现这里并没有获取到存储我们后端发来的token,那他是在哪里存储的呢?

  • 然后我们去store下面看看

image-20210419212740207

  • 发现他设置了token,res.token

image-20210419212836084

  • setToken的来源在哪里,ctrl+左键点SET_TOKEN

image-20210419212921306

  • 发现他在Cookie中通过set(),将token设置到了cookie中

image-20210419212949236

  • 然后他们一般会帮axious封装到request.js 脚本中

image-20210419213218381

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

然后他们一般会帮axious封装到request.js 脚本中

image-20210419213218381

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-VBiclBkK-1714816557000)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

Logo

快速构建 Web 应用程序

更多推荐