发表于: 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
评论