問題描述
在做登錄時進行驗證碼判斷的功能時,因爲要將生成驗證碼的文本存儲在Redis中,微服務框架無法直接使用Sesiion,所以需要模擬之前Session底層的做法,將session的id值存儲在cookie中來區分不同的瀏覽器客戶端訪問。所有需要在第一次生成驗證碼時,生成這個cookie返回給瀏覽器。當用戶第二次刷新驗證碼時,直接通過這個ID標識覆蓋Redis中存儲的驗證碼。
但是生成的cookie始終無法在Response對象中返回給瀏覽器。
Controller中的代碼是這樣的:
@RequestMapping(value = "getValiCodeImg", method = RequestMethod.GET)
public void getValicodeImg(HttpServletRequest request, HttpServletResponse response) {
try {
verifyCode.drawImage(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
userService.saveValiCode(valiCodeId, verifyCode);
String valiCodeId = CookieUtils.getCookieValue(request, "valiCodeId");
if (valiCodeId == null || valiCodeId.equals("")) {
valiCodeId = "valiCodeId_"+UUIDUtil.getUUID();
CookieUtils.setCookie(request, response, "valiCodeId", valiCodeId);
}
}
解決方式
在設置Cookie之後,再生成驗證碼就可以了:
@RequestMapping(value = "getValiCodeImg", method = RequestMethod.GET)
public void getValicodeImg(HttpServletRequest request, HttpServletResponse response) {
String valiCodeId = CookieUtils.getCookieValue(request, "valiCodeId");
if (valiCodeId == null || valiCodeId.equals("")) {
valiCodeId = "valiCodeId_"+UUIDUtil.getUUID();
CookieUtils.setCookie(request, response, "valiCodeId", valiCodeId);
}
try {
verifyCode.drawImage(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
userService.saveValiCode(valiCodeId, verifyCode);
}