发表于: 2018-01-24 20:20:18

1 603


今天完成的事情:

1.梳理了整个流程:

  一开始没有写注册模块,直接在数据库中插入了一条账号密码。然后准备了加密工具类,昨天已经传过了,就不在这放了。然后在controller里面当有登录请求时先验证账号密码是否和数据库的一样,然后加密用户名和登录时间生成token,进而将token放到cookie中,然后将cookie添加到请求,这个时候就可以返回需要登录才能查看的界面了。

  以上呢,就是昨天做的事情

  今天做的是拦截器通过cookie中的token来判断用户是否登录:

首先在springmvc中添加拦截器:

<mvc:interceptors>
   <mvc:interceptor>
       <mvc:mapping path="/u/*"/>
       <bean class="com.ptteng.interceptor.LoginInterceptor"></bean>
   </mvc:interceptor>
</mvc:interceptors>

按照任务要求,拦截/u/开头的请求。

然后是拦截器类:

package com.ptteng.interceptor;

import com.ptteng.model.User;
import com.ptteng.service.UserService;
import com.ptteng.util.DesUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
@Autowired
   private UserService userService;

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器~~~~~~~~~~~~~~~~~~~~~~~");
       Cookie[] cookie = request.getCookies();
       if (cookie != null) {
for (int i = 0; i < cookie.length; i++) {
if (cookie[i].getName().equals("Token")) {
String token = cookie[i].getValue();
                   String tokenDecrypt = new DesUtil("xizi").decrypt(token);
                   String[] arrToken = tokenDecrypt.split(",");
                   String username = arrToken[0];
                   System.out.println("token中的username"+username);
                   String logtime = arrToken[1];
                   System.out.println("token中的logtime"+logtime);
                   User user = userService.getUser(username);
                   long time = user.getLogtime();
                   String time1 = String.valueOf(time);
                   System.out.println("渠道token数据");
                   if (logtime.equals(time1)) {
System.out.println("token匹配成功");
                       return true;
                   } else {
System.out.println("这里不属于你,快走吧");
                   }
}
}
}
request.getRequestDispatcher("/login").forward(request, response);
       return false;
   }

@Override
   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("搞毛呢");
   }


public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("我也不知道啊");
   }
}

这里主要是解析token,然后分离用户名和登录时间与数据库的数据进行对比,正确的话返回true值。下面是对应的拦截器的controller:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response, User user, Model model) throws Exception {
boolean check = userService.compareUser(user.getUsername(), user.getpassword());
   if (check == true) {
try {
//定义一个时间,也是登陆时间
           Long time = System.currentTimeMillis();
           user.setLogtime(time);
           userService.updateLogtime(user.getUsername(), user.getLogtime());
           //定义加密需要的token
           String s = user.getUsername() + "," + time;
           //将这个字符串进行加密生成Token
           String Token = new DesUtil("xizi").encrypt(s);
           System.out.println("这是controller:"+Token);
           //保存到cookies
           Cookie cookie = new Cookie("Token", Token);
           //对cookies进行设置
           cookie.setMaxAge(60);
           cookie.setPath("/");
           //添加到请求
           response.addCookie(cookie);

       } catch (Exception e) {
e.printStackTrace();
       }
return "redirect:/u/career";
   } else return "error";

true值的话可以正常访问需要登录的界面,而false就只能见到error的界面了。

2.safufu的以为自己的程序出了毛病,因为cookie的有效期设置的太久,导致我一度认为自己的拦截器起不到任何作用,傻逼一样地发愁了好半天。。。最后询问曲师兄,才晓得问题是cookie的原因,在浏览器清除cookie之后正常了。这个问题是同一个用户创建了两个cookie,导致在输出的时候经常出现一个正确一个错误的输出状态。还是挺有意思的额。。。

3.写了一个注册功能,经过测试可以正常使用.改了改小bug,点击职业的请求url搞错了,导致无论登录与否都要重新登录,修改了该url以及controller的方法,现在已经全部正常,感觉这部分知识很有趣。。。下面上一下自己的代码,主要是关于token的:这个就是完成验证的controller了:

@RequestMapping(value = "/u/career", method = RequestMethod.GET)
public String ListCareers(HttpServletRequest request, HttpServletResponse response, User user, Model model) throws Exception {
Cookie[] cookies = request.getCookies();
   if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("Token")) {
try {
DesUtil desUtil = new DesUtil("xizi");
                   String Token = cookies[i].getValue();
                   String decToken = desUtil.decrypt(Token);
                   String[] arr = decToken.split(",");
                   String username = arr[0];
                   String logtime = arr[1];
                   User user1 = userService.getUser(username);
                   long time = user1.getLogtime();

                   String time1 = String.valueOf(time);

                   if (logtime.equals(time1)) {
List<Career> careers = careerService.getAllCareer();
                       List<Career> careersBack = careerService.getBack();
                       model.addAttribute("careersBack", careersBack);
                       List<Career> careersFace = careerService.getFace();
                       model.addAttribute("careersFace", careersFace);
                       List<Career> careersMobile = careerService.getMobile();
                       model.addAttribute("careersMobile", careersMobile);

                       return "11";
                   }
} catch (Exception e) {
e.printStackTrace();
               }
}
}

}return "redirect:/login";
}

如果登录且cookie有效期设置的足够,可以正常访问。否则只能返回登录界面。

4.注册的功能其实就是一个项数据库增加数据:这个是注册的jsp页面

<html>
<head>
   <title>欢迎来到注册界面</title>
</head>

<body>
<h2>请填写注册信息</h2>
<hr>
<form action="${pageContext.request.contextPath}/addUser" method="post" modelAttribute="user">
   用户名:<input name="username" type="text"/><br/>
   密 码:<input name ="password" type="password"/><br/>
   时 间:<input name ="logtime" type="number"/><br/>
   <br/>
   <input type="submit" name="tijiao1" value="注册">
   <input type="reset" name="chongzhi" value="重置">
</form>
</body>
</html>

   然后是接受这个请求的controller:

@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String InsertUser(String username,String password,long logtime){
userService.insertUser(username,password,logtime);
   return "redirect:/login";
}

界面奇丑:

至此任务五算是结束了,但是向沉淀一下,晚点交任务。

今天遇到的问题

   都已经在我牛逼的艳行大师兄的帮助下解决了。

今天的收获:

   以上

明天计划的事情:

明天沉淀一下知识点,主要是再深入的了解一下cookie和加密解密过程以及md5还有des算法。



返回列表 返回列表
评论

    分享到