发表于: 2018-01-24 20:20:18
1 601
今天完成的事情:
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算法。
评论