发表于: 2017-11-05 19:20:03

1 742


今天完成的事情

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);
   //Stringint
   int id = Integer.parseInt(id_s);
   String time = value.substring(index+1);
   //Stringlong
   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中使用的话,直接调用相关的方法就行了,不过最后自定义一个方法,将加密的各个操作都写入其中,在控制器中直接调用即可,以免控制器中的代码太过冗长。


明天的计划

完成任务六步骤一


遇到的问题



收获

了解了拦截器的作用,以及两种加密方法。



返回列表 返回列表
评论

    分享到