发表于: 2018-01-09 20:05:12

1 563


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

完成了登陆状态的保留,使用cookie+session的方式进行的验证.

/u/**请求我是在拦截器里做了拦截了,这里给了cookie之后验证了才会放行.

代码:

controller,这里代码我还没进行重构,明天进行最终版本的修改.

@RequestMapping(value = "/loginPage",method = RequestMethod.POST)
public String checkLogin(HttpServletResponse response, HttpSession session, Model model, User user){
if(userServiceImpl.checkLogin(user)){
String code = Encrypt.getSHA256Str(Encrypt.getSalt()).toUpperCase();
       Cookie cookie = new Cookie("key", code);
       cookie.setMaxAge(60*60*24);
       cookie.setPath("/");
       response.addCookie(cookie);
       session.setAttribute("key",code);
       session.setMaxInactiveInterval(60*60*24);
       return "redirect:/u/joblist";
   }else {
model.addAttribute("intro","用户名或密码错误,请重新登陆");
       return "redirect:/login";
   }
}

采用的逻辑是,获取一个随机数,作为value值给cookie和session,取用一个相同的key,分别存储在本地浏览器端和服务器内存中.这是获取随机数的方法,我使用的是我获取盐值的工具:

public static String getSalt(){
byte[] bytes =new byte[10];
   SecureRandom sr = new SecureRandom();
   sr.nextBytes(bytes);
   return byte2Hex(bytes);
}

下面是拦截器:

@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
Cookie cookie = WebUtils.getCookie(httpServletRequest, "key");
   if(cookie !=null){
if (cookie.getValue().equals(httpServletRequest.getSession().getAttribute("key"))) {
return true;
       }
}
httpServletResponse.setHeader("refresh","0,/login");
   return false;
}

拦截器这里使用了spring提供的工具类WebUtils,他能直接从request中获取到指定key值的cookie,然后再把该key与服务器端的session中存放的值进行比对,如果相同则放行,不同就拦截下来进行跳转回登陆页面.

明天计划的事情:(一定要写非常细致的内容) 

使用token加密,然后去服务器通过用户ID比对的方式完成登录状态的保留.
遇到的问题:(遇到什么困难,怎么解决的) 

null
收获:(通过今天的学习,学到了什么知识)

cookie和session到底是啥东西,有了确切的认知.


返回列表 返回列表
评论

    分享到