发表于: 2017-06-26 11:17:46
1 1108
今日完成:
学习MD5、DES加密工具
学习@Param注解、interceptor拦截器、COOKIE的生成
明日计划:
重写一遍登录实现代码,开始任务6
收获:
知识点1:@Param
@Param的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中
mybatis不使用@Param注解,dao接口参数只能有一个,如果需要多个参数(int,string等)的话,必须用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值呢?
用户A的token值被用户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时表示请求结束,后续的Interceptor和Controller都不会再执行。当会返回值为true时,就会继续调用下一个Interceptor的perHandle方法,如果是最后一个的时候,就会调用当前请求的Controller方法。
2.postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView modelAndView)方法,该方法在请求处理之后,也就是Controller方法调用之后执行。但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle被调用的方向给preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行。
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
08:20-08:40洗漱
08:40-09:00吃饭
09:10-09:30申请加学分
09:30-11:50了解cookie,token,session,interceptor
12:10-12:50吃饭
13:10-14:20休息
14:30-18:00了解DES、MD5加密工具
18:20-19:20吃饭
19:30-20:24剪头发
20:30-21:45
21:50-23:30写代码
23:30-00:10-师兄讲解登录注册怎么实现
00:10-01:00整理思路
01:30睡觉
评论