发表于: 2017-11-05 19:20:03
1 741
今天完成的事情
1.修改拦截器类,对带/u/的请求进行拦截,验证其中的Cookei
在springMVC中进行配置,用以拦截url中带有/u/的请求:
<mvc:interceptors>
<!--拦截器,验证Cookie-->
<mvc:interceptor>
<!--拦截路径,如果不配置,将拦截所有-->
<mvc:mapping path="/u/**"/>
<bean class="com.jnshu.util.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在拦截器类中自定义一个方法,用来验证Cookie中的信息:
private boolean isTrue(Cookie cookie)throws Exception{
String value = DESEncryptTools.decrypt(cookie.getValue());
int index = value.indexOf(".");
String id_s = value.substring(0,index);
//String转int
int id = Integer.parseInt(id_s);
String time = value.substring(index+1);
//String转long
long login_time = Long.parseLong(time);
//判断数据库中是否有此用户
if (null!=userService.getById(id)){
long time_DB= userService.getById(id).getLogin_at();
System.out.println(time_DB);
System.out.println(login_time);
if (time_DB==login_time){
return true;
}
}else{
return false;
}
return false;
}
先对Cookie中的信息进行解密,得到一个字符串,其组成是用户id + " . " + 用户上次登陆时间,String time = value.substring(index+1)用来取出 " . " 之后的登陆时间字符串,转换为long类型,取出数据库中用户上次登陆的时间,用两者来进行比较,如果相等,就返回true,在preHandle方法中调用相关的验证Cookei的方法,若验证通过,就返回true,请求将会通过拦截器,到达Controller。
在登陆页面的控制器中,生成token令牌,加密并放入Cookie中,设置重定向到一个欢迎页面,这样浏览器就可以接受到所生成的Cookie,在欢迎页面可以选择进入到只有登陆过且Cookie还有效的用户才能进入的页面,部分代码:
//加密
String token= DESEncryptTools.encrypt(token2);
//token放入Cookie
Cookie cookie1 = new Cookie("token",token);
cookie1.setMaxAge(30*60);
//路径,访问此路径下的资源时,其请求才会携带此Cookie
cookie1.setPath("/u/");
response.addCookie(cookie1);
return "redirect:/welcome";
在欢迎页面中,设置如下:
<form action="/u/home" >
<h1>welcome</h1>
<input type="submit" value="进入首页">
</form>
其请求将会先经过拦截器,对其请求中携带的Cookie进行验证,若其中的信息相符,则拦截器返回true,请求会继续发送到相应的控制器,若验证不通过,则跳转到指定的页面,这里设置为登陆页面login.jsp:
if (!isAllow(request))
response.sendRedirect("/login.jsp");
return true;
编写一个控制器,用于处理/u/home请求,和/home的基本一致
在tiles中再配置一个子模板,用于/u/下的页面的加载:
<definition name="3.*" extends="template">
<put-attribute name="title" value=""/>
<put-attribute name="header" value="/loginHeader.jsp"/>
<put-attribute name="body" value="/{1}.jsp"/>
<put-attribute name="footer" value="/footer.jsp"/>
</definition>
基本都和之前的一样,为了显示区别,修改了头部
普通页面:
登陆后的页面:
2.使用MD5对用户的密码进行加密,将加密后的数据存入数据库,对密码进行验证时,直接取出数据库中加密后的字符串,再将用户提交的密码用MD5加密,将两个MD5值进行比较,因为绝大多数情况下,一条信息对应一个唯一的MD5值,所以如果两个密码时一样的,那么两个MD5值也应该是一样的,这样就完成了验证。
加密并存入数据库:
String name = request.getParameter("user_name");
String password = request.getParameter("user_password");
//将用户密码加密为MD5值
String password_hex = MD5.encrypt(password);
//获取当前时间
long now = System.currentTimeMillis();
if (null != userService.get(name)){
return "logon_fail";}
else{
user.setUser_name(name);
user.setUser_password(password_hex);
user.setLogin_at(now);
userService.add(user);
return "redirect:/home";}
3.提交任务五
任务小结
任务五主要需要了解Cookie 和Session ,对用户登陆的相关信息进行加密,存储到Cookie中,在下此访问的时候可以对Cookie进行验证,若通过,就直接进入页面,若不通过,就跳转到登陆页面,重新登陆。对于验证,主要是通过springMVC的拦截器来进行的,需要实现相关的接口,并且自定义相关的方法来进行验证。对于加密方法,DES和MD5,算法很复杂,简单了解即可,在java中使用的话,直接调用相关的方法就行了,不过最后自定义一个方法,将加密的各个操作都写入其中,在控制器中直接调用即可,以免控制器中的代码太过冗长。
明天的计划
完成任务六步骤一
遇到的问题
无
收获
了解了拦截器的作用,以及两种加密方法。
评论