发表于: 2017-06-26 11:17:46

1 1108


今日完成:

学习MD5、DES加密工具

学习@Param注解、interceptor拦截器、COOKIE的生成




明日计划:

重写一遍登录实现代码,开始任务6


收获:

知识点1:@Param

@Param的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中

mybatis不使用@Param注解,dao接口参数只能有一个,如果需要多个参数(intstring等)的话,必须用map取值,用索引取值,麻烦而且不清晰。

public int insert(@Param("username") String username, @Param("password") String password);

对于sql语句

<insert id="insert">
   INSERT INTO user (username, password) VALUE (#{username},#{password})
</insert>

需要注意的是:

1.使用@Param注解来声明参数时,映射语句使用#{}${}都可以,不使用@Param注解来声明参数时,必须使用#{}方式,如果使用${}的方式就会报错。

2.使用里@Param注解的话在mapper.xml不用加parameterType,因为在接口中就声明了类型,加上@param后自动识别。


知识点2:使用cookie登录

怎样判定这个用户处于登录状态,判断用户是否有权利访问某个URL,例如管理自己的博客。

首先需要了解一个只是点:HTTP协议无状态。

由于HTTP协议是无状态的,服务器无法知道两次访问是不是来自同一个人。

这里就需要使用COOKIE了,使用cookie可以让服务器知道用户是否登录。

cookie是什么?

cookie是一个文本文件,保存在客户客户端硬盘中,或在用户的浏览器内存中。这个文件对用户来说是透明的,可以通过浏览器工具查看当前的cookie

当用户第一次访问的时候,setcookie函数会生成cookie文件,并保存在浏览器的response Header,注意这个时候访问服务器中的全局数据$_COOKIE会发现这个数组为空。因为在客户第二次访问的时候才会从客户端把cookie信息传递到服务器端


怎么利用cookie实现用户登录呢?


使用COOKIE保存用户的TOKEN值,这样服务器会读取在$——COOKIE数组里面的信息判断用户是否登录


为什么登录成功后,需要梗系用户的TOKEN值呢?

用户Atoken值被用户B窃取,这样用户B伪造COOKIE,就可以直接登录用户A的账号,绕过里用户名和密码的验证。

所以登录后更新用户token值可以防止这样的情况。

第二就是保证一个账号只能一个用户登录。


知识点3:拦截器interceptor

springmvc中使用interceptor拦截器的主要作用拦截用户的请求并进行相应的处理,比如通过它来进行权限验证,或者来判断用户是否登录,或者像12306那样判断当前时间是否是购票时间。


springmvc中的interceptor拦截请求是通过继HandlerInterceptor接口类来实现的,或者是继承实现了WebRequestInterceptor的类。

 

HandlerInterceptor接口中定义里三个方法,我们就是通过这个三个对用户的请求进行拦截处理的。


1.per(HttpServletRequest request,HttpServletReponse response,Object handle)方法,该方法将在请求处理之前进行调用。

该方法返回的值是布尔值Boolean类型,当它返回为false时表示请求结束,后续的InterceptorController都不会再执行。当会返回值为true时,就会继续调用下一个InterceptorperHandle方法,如果是最后一个的时候,就会调用当前请求的Controller方法。


2.postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView modelAndView)方法,该方法在请求处理之后,也就是Controller方法调用之后执行。但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle被调用的方向给preHandle是相反的,也就是说先声明的InterceptorpostHandle方法反而会后执行。


3.afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handle,Exception ex)方法,该方法将在整个请求结束之后也就是DispatcherServlet渲染里对于的视图之后执行,作用是用于进行资源清理工作的。



怎样判断用户是否登录?

* 登录注册实现步骤:
* 用户注册时调用MD5工具类给密码加盐后存储在数据库。
* 用户登录时通过@RequestParam接收到登录操作传递过来的username和password,
* 首先把传递过来的password加盐,然后调用service方法来判定数据库是否有这个用户和密码,
* 如果没有则跳转到登录失败页面,重新登录。
* 登录成功,再去拿这个用户id和登录时间,生成token。
* 然后使用DES工具类加密这个token,并将加密的字节数组转换成16进制
* 根据加密后的token生成cookie,并设置生命周期和路径

* 浏览器添加一个cookie,服务器相应添加一个session

        String md5 = MD5Util.stringToMD5(password);
       if (userService.verification(username, md5))
{
           User user = userService.selectByUsername(username);
           Long id = user.getId();
           Long createDate = new Date().getTime();
           String str = id + "=" + createDate;
           //加密
           byte[] result = DESUtil.desCrypto(str, "12345678");
           //把加密的字节数组转换成16进制
           String results = TypeUtil.bytesToHexString(result);
           System.out.println("生成的results:"+results);
           Cookie cookie = new Cookie("token", results);
           cookie.setMaxAge(60 * 60 * 24 * 7);//7天
           cookie.setPath("/");
           System.out.println("新生成cookie和其MaxAge:" + cookie.getName() + "-->" + cookie.getMaxAge());
           httpServletResponse.addCookie(cookie);
           HttpSession session = httpServletRequest.getSession();
           session.setAttribute("user", user);
           for (Cookie c : httpServletRequest.getCookies()) {
               System.out.println("cookes添加到response后重新获取cookies和其MaxAge:" + c.getName() + "-->" + c.getMaxAge());
           }
try {
               httpServletResponse.sendRedirect("/index");
           } catch (Exception e) {
               e.printStackTrace();}
       } else {
try {
               httpServletResponse.sendRedirect("no");
           } catch (IOException e) {
               e.printStackTrace();}
       }

时间都去哪了?


06.26

0820-0840洗漱

0840-0900吃饭

0910-0930申请加学分

0930-1150了解cookietokensessioninterceptor

1210-1250吃饭

1310-1420休息

1430-18:00了解DESMD5加密工具

1820-1920吃饭

1930-2024剪头发

2030-2145

2150-2330写代码

2330-0010-师兄讲解登录注册怎么实现

0010-01:00整理思路

0130睡觉



返回列表 返回列表
评论

    分享到