最近老板想要将公司业务数据进行一个汇总,做一个数据可视化的平台,由于呢公司的业务比较零散,前后四五个平台,我就想着做一个后台统一收集几个平台的数据进行梳理展示,于是用到了restTemplate,其中要获取验证码进行登录,就记录下来。
技术选型:spring boot 2 + vue3
直接使用遇到的问题
由于前后端分离,restTemplate获取数据和前端获取数据属于两个会话请求,这就导致set-Cookie不一致,在前端输入验证码提交后台进行登录操作会失败
解决方案
使用restTemplate获取验证码图片,然后转换成二进制流的形式让前端获取即可解决
代码如下
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "image/jpeg");
HttpEntity<MultiValueMap<String, Object>> formEntity = new HttpEntity<MultiValueMap<String, Object>>(headers);
// Resource类写出来,方便参考
ResponseEntity<org.springframework.core.io.Resource> responseEntity = restTemplate.exchange(PATH+"servlet/xxxx.do(你自己的地址)", HttpMethod.GET, formEntity, org.springframework.core.io.Resource.class);
String setCookie = responseEntity.getHeaders().get("Set-Cookie").get(0);
String cookies = setCookie.split(";")[0];
// 写了一个缓存存储cookies
CacheCookies cacheCookies = CacheCookies.getCacheCookies();
cacheCookies.setCookies(cookies);
InputStream inputStream = null;
try {
// 获取响应中的body
inputStream = responseEntity.getBody().getInputStream();
// 转换成流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int num = inputStream.read(buffer);
while (num != -1) {
baos.write(buffer, 0, num);
num = inputStream.read(buffer);
}
baos.flush();
byte[] data = baos.toByteArray();
// spring boot使用ServletRequestAttributes获取request或者response等
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = requestAttributes.getResponse();
try {
response.getOutputStream().write(data);
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如上所示即可获取image,登陆成功后把token写入到请求头即可获取想要的数据。