发表于: 2017-08-23 15:35:02
1 1108
今天做的事:
花了半天的时间,终于把任务五完善,不过也算没有完美解决把
新加入了登出功能来删除cookie
public void dropCookie(HttpServletResponse response){
Cookie cookie = new Cookie("Token",null);
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
Controller
@RequestMapping(value = "/a/login",method = RequestMethod.GET)
public String getlog(Map<String,Object> map){
map.put("user",new User());
return "login";
}
@RequestMapping(value = "/a/login",method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response,User u,Model model) throws ServletException,IOException{
flag = uS.check(u);
System.out.println("********Log***********");
System.out.println(flag);
if(flag == true) {
// 这里使用new则所有Spring依赖注入失效
// loginCookie lC = new loginCookie();
lC.setCookie(response,u);
model.addAttribute("username",u.getUser());
return "redirect:/a/u/Profession";
}
else
return "redirect:/a/error";
}
@RequestMapping(value = "/a/u/Profession",method = RequestMethod.GET)
public String getPre(Model model,String username){
//返回登录客户名
model.addAttribute("username",username);
//返回前端职业
List<BigProfession> frot_ends = pS.getFrot_end();
model.addAttribute("frot_ends", frot_ends);
//返回后端职业
List<BigProfession> back_ends = pS.getBack_end();
model.addAttribute("back_ends", back_ends);
// 返回前端在学人数
frot_endNum = pS.getFrot_endNum();
model.addAttribute("frot_endNum", frot_endNum);
// 返回后端在学人数
back_endNum = pS.getBack_endNum();
model.addAttribute("back_endNum", back_endNum);
date = System.currentTimeMillis();
model.addAttribute("date", date);
return "11";
}
@RequestMapping(value = "/a/logout",method = RequestMethod.GET)
public String logout(HttpServletResponse response){
lC.dropCookie(response);
return "redirect:/a/login";
}
然后运行后是这样的
点击登出后就返回登录页面,同时禁止访问职业页面
但是有个小bug
就是虽然cookie在,但是取不到登录用户名了(就这样吧先,就不花时间完善了)
并且昨天的三次拦截(其实是多次拦截)问题也解决了
首先在拦截器中设置了监控
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{
// loginCookie lC = new loginCookie();
boolean flag = lC.checkCookie(request,response);
System.out.println("进来" + count++ + "次 "+ request.getRequestURI());
// System.out.println("Interceptor's response: " + response);
if (flag == false){
response.sendRedirect("/a/login");
// System.out.println("进入拦截器了");
return false;
}
经排查发现
发现是页面中的一些静态资源的问题
这些地方的静态资源被拼接了url,具体原理不清楚,但是删除掉这些静态资源就没有拦截多次的现象了
至此,任务五就谢幕把,还有一些坑需要填,但是任务五的所有要求都已完成,以后或许也会碰到相关问题,就不在此纠结耗费更多的时间了
也感谢师兄的指导,终于排查出拦截器拦截多次的问题。
深度思考:
1.cookie和session:
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
cookie存在客户端上,获取cookie是浏览器从本地提取文件。
Cookie具有不可跨域名性。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Session对象是在客户端第一次请求服务器的时候创建的。
Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。
同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
总结下来:cookie由后端创建,保存在客户端本地调用;session由服务器端自动生成,不需后端创建,保存在服务端。
cookie最常见的场景是自动登录;session常见的场景就是会话追踪。
2.拦截器、监听器、过滤器:
过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。
作者:Kangol LI
链接:https://www.zhihu.com/question/35225845/answer/61876681
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(知乎的这个功能真心屌!!!点赞)
这个高票答案最赞!!!!!
明天计划:开启任务六的征程
问题:基本解决
收获:实现一个功能,新增一个bug(-_-||);解决一个bug,但最终问题根源没有去解决。
评论