发表于: 2017-08-22 11:38:42

2 1097


今天做的事:

上午把cookie的逻辑实现

debug果然是一项nb技能,如果没有debug,一点一点的寻找逻辑错误,不知道我还能不能做出来

废话少说,先贴代码

@RequestMapping(value = "/login",method = RequestMethod.GET)
public String getlog(Map<String,Object> map){
map.put("user",new User());
   return "login";
}

@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response,User u) throws ServletException,IOException{

flag = uS.check(u);
   System.out.println("********Log***********");
   System.out.println(flag);

   if(flag == true) {

try {
User user = uS.selectByName(u.getUser());
           DesUtil des = new DesUtil("JAVA");
           String str = user.getUser() +","+ "" + user.getLogtime();
           String Token = des.encrypt(str);
Cookie cookie = new Cookie("Token", Token);
cookie.setMaxAge(60 * 60 * 10);
cookie.setPath("/");
response.addCookie(cookie);
System.out.println("logCookie's value: " + cookie.getValue());
} catch (Exception e) {
e.printStackTrace();
}
 return "redirect:/Profession";
   }
else
       return "redirect:/error";
}

以上是登陆模块,在该模块中实现生成cookie的操作(因为中间有注释的代码,所以分块贴出来的布局有点乱)

这里面最关建的一句是

User user = uS.selectByName(u.getUser());

因为当确认用户帐密正确后,需要在数据库中取对象user,否则会导致传入的user的logTime=null,因为并没有规定传入user的logTime,而且对数据库中的logTime的更新也是发生在Service层

flag uS.check(u);

这是和昨天比较缺少的一块


接下来是只有登录后才可访问的模块

@RequestMapping(value = "/Profession",method = RequestMethod.GET)
public String gettest(HttpServletRequest request,HttpServletResponse response,Model model)throws ServletException,IOException{
Cookie[] cookies = request.getCookies();
       if(cookies != null){
for(int i = 0;i < cookies.length;i++) {
if (cookies[i].getName().equals("Token")) {

System.out.println("*****P*****");
                   System.out.println("cookie's value: " + cookies[i].getValue());
                   try {
DesUtil des = new DesUtil("JAVA");
                       String Token = cookies[i].getValue();
                       String decToken = des.decrypt(Token);
                       System.out.println("decToken: " + decToken);
                       String[] sArr = decToken.split(",");
                       String username = sArr[0];
                       String logT = sArr[1];
                       //String转换Long
                       Long logTime = Long.parseLong(logT);
                       System.out.println("username: " + username);
                       System.out.println("logTime: " +logTime);
                       User user = uS.selectByName(username);
                       System.out.println(user);
                       if (logTime.equals(user.getLogtime())) {
cookies[i].setMaxAge(0);
                           response.addCookie(cookies[i]);
                           System.out.println("cookie's value: " + cookies[i].getValue());
                           System.out.println("进来说一声");
                           //返回前端职业
                           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";
                       }

} catch (Exception e) {
e.printStackTrace();
                   }
}
}
}

return "redirect:/login";
   }

这块的逻辑为:

首先查找cookie,找到名为Token的cookie,解密后对比,如果时间戳正确,则进入页面,并且删除cookie;其他所有不满足上述条件的情况全部返回登录界面。这里删除cookie是为了演示效果明显。


接下来演示如下

首先是在首页有个登录按钮(但是我不会做。。。)

此时我先点击职业那个位置,会直接跳转到登录界面

接下来如果输入错误用户名,或者任意错误即跳转至错误页面

如果帐密正确,则跳转至职业界面

此时离开此页面跳转到首页,再点击职业标签,会再次跳转至登录页面


如果将删除cookie那行注释掉,那么就不会重新登录了,在设置的时间限制内都可通过cookie的记录保证用户不用每次页面跳转都需要登录。


下午实现拦截器功能


拦截器功能虽已实现,但是有一定问题,拦截cookie并没有实现我想要的功能,需要继续钻研

先把拦截器如何实现写一下

参考链接:http://www.cnblogs.com/DoubleEggs/p/6112119.html

首先定义Interceptor

public class LoginInterceptor implements HandlerInterceptor {

@Autowired
   private loginCookie lC;
   
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{

//        loginCookie lC = new loginCookie();
       boolean flag = lC.checkCookie(request,response);
       if (flag == false){
response.sendRedirect("/a/login");
           System.out.println("进入拦截器了");
           return false;
       }
System.out.println("它进来了啊");
       return true;
   }

@Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                          ModelAndView modelAndView) throws Exception {

}

@Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}

}

需要实现HandlerInterceptor接口的三个方法

然后在spring-web.xml中配置拦截器

<!--拦截器-->
<mvc:interceptors>
   <mvc:interceptor>
       <mvc:mapping path="/a/u/**"/>
       <bean class="com.ptteng.Interceptor.LoginInterceptor"/>
   </mvc:interceptor>
</mvc:interceptors>

这样配置后会对所有/a/u的页面进行拦截

然后关键的地方出现了

我将cookie单独抽取出来做了个实现类,然后通过调用的方式实现拦截器内部方法,看代码把

@Service
public class loginCookie {

@Autowired
   private userService uS;
   
   public void setCookie(HttpServletResponse response,User u)throws ServletException,IOException{
try {
String username = u.getUser();
           System.out.println(username);
           User user = uS.selectByName(username);
           DesUtil des = new DesUtil("JAVA");
           String str = user.getUser() + "," + "" + user.getLogtime();
           String Token = des.encrypt(str);
   
           Cookie cookie = new Cookie("Token", Token);
           //保存10分钟
//            cookie.setMaxAge(60 * 60 * 10);
           //离开浏览器即可删除
//            cookie.setMaxAge(-1);
           cookie.setPath("/");
           response.addCookie(cookie);
           System.out.println("set打印");
       }catch (Exception e){
e.printStackTrace();
       }
}

public boolean checkCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{

boolean flag = false;
       
       Cookie[] cookies = request.getCookies();
       if(cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("Token")) {

System.out.println("*****P*****");
                   System.out.println("cookie: " + cookies[i]);
                   try {
DesUtil des = new DesUtil("JAVA");
                       String Token = cookies[i].getValue();
                       String decToken = des.decrypt(Token);
                       System.out.println("decToken: " + decToken);
                       String[] sArr = decToken.split(",");
                       String username = sArr[0];
                       String logT = sArr[1];
                       //String转换Long
                       Long logTime = Long.parseLong(logT);
                       System.out.println("username: " + username);
                       System.out.println("logTime: " + logTime);
                       //问题模块
                       User user = uS.selectByName(username);
                       System.out.println(user);
                       System.out.println(cookies[i].getName());
                       System.out.println(cookies[i].getValue());
                       if (logTime.equals(user.getLogtime())) {
//                            cookies[i].setMaxAge(0);
//                            response.addCookie(cookies[i]);
                           flag = true;
                           System.out.println("删除cookie啊");
                       }
} catch (Exception e) {
e.printStackTrace();
                   }
}
}
}
return flag;
   }

}

然后controller中的代码

@RequestMapping(value = "/a/login",method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response,User u) 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);
   return "redirect:/a/u/Profession";
   }
else
       return "redirect:/a/error";
}

需要cookie的页面

 @RequestMapping(value = "/a/u/Profession",method = RequestMethod.GET)
public String getPre(Model model){
//返回前端职业
       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";
   }


这里还有个坑,就是使用new的方式会导致所有的Spring依赖注入失效,导致之前运行一直有问题,Service层和dao层自动注入的对象都无法使用。切记切记!!!


继续说,我目前的问题就是,我对cookie进行拦截的时候,共拦截了3次不清楚是什么原因。

已经排查了很久了,目前还没找到问题的根源,明天需要继续查找。


可以看到这里已经有两次进入拦截器了,上面还有。

明天需要花时间好好研究研究。


意外收获的知识点

form表单

之前我使用的是:

这种形式的form表单提交,在师兄的建议下,修改为上面的形式,这样可以在password输入栏中隐藏密码


关于form表单的东西还挺多的,但是今天实在是没想到出现之前那个问题,所以就没细看,先贴个链接,以后需要的时候方便查找:

http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html


明天计划:解决今天的问题


问题:如上


收获:拦截器;cookie成功实现Token


进度:开始时间:2017.08.19

    预计demo:2017.08.23

    是否有延期风险:请假一天,延期1日;cookie逻辑有难度,不确定是否还会延期

                                果然cookie这里有难度,需要再延期一天整明白

    禅道链接:http://task.ptteng.com/zentao/project-task-285-unclosed.html



返回列表 返回列表
评论

    分享到