发表于: 2017-08-23 15:35:02

1 1110


今天做的事:

花了半天的时间,终于把任务五完善,不过也算没有完美解决把

新加入了登出功能来删除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,但最终问题根源没有去解决。


返回列表 返回列表
评论

    分享到