此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

2.2.3、AdminController

  1 package com.xxx.web.admin;2 3 import java.util.List;4 5 import javax.servlet.http.HttpServletRequest;6 import javax.servlet.http.HttpServletResponse;7 8 import org.springframework.beans.factory.annotation.Autowired;9 import org.springframework.stereotype.Controller;10 import org.springframework.web.bind.annotation.RequestMapping;11 import org.springframework.web.bind.annotation.RequestParam;12 import org.springframework.web.bind.annotation.ResponseBody;13 import org.springframework.web.servlet.ModelAndView;14 15 import com.xxx.model.userManagement.Admin;16 import com.xxx.service.userManagement.AdminService;17 import com.xxx.util.admin.AdminCookieUtil;18 19 /**20  * adminController21  */22 @Controller23 @RequestMapping("/admin")24 public class AdminController {25     26     @Autowired27     private AdminService adminService;28     29     /**30      * 管理员注册31      */32     @ResponseBody33     @RequestMapping("/register")34     public boolean register(@RequestParam("username") String username,35                             @RequestParam("password") String password){36         Admin admin = new Admin();37         admin.setUsername(username);38         admin.setPassword(password);39         40         boolean isRegisterSuccess = adminService.register(admin);41         42         return isRegisterSuccess;43     }44     45     /**46      * 管理员登录47      */48     @RequestMapping("/login")49     public ModelAndView login(@RequestParam("username") String username,50                               @RequestParam("password") String password,51                               HttpServletResponse response){52         53         54         Admin admin = adminService.login(username, password);55         56         ModelAndView modelAndView = new ModelAndView();57         if(admin == null){58             modelAndView.addObject("message", "用户不存在或者密码错误!请重新输入");59             modelAndView.setViewName("error");60         }else{61             modelAndView.addObject("admin", admin);62             modelAndView.setViewName("userinfo");63             /*64              * 这为什么不直接传一个username,而传了一个admin,65              * 是因为在实际开发中,你传过去的信息可能不只是username,还有用户手机号、地址等等66              */67             AdminCookieUtil.addLoginCookie(admin, response);68         }69         70         return modelAndView;71     }72     73     /*****************************mybatis xml方式解决的问题*******************************/74     /**75      * 根据username或password查找List<Admin>76      */77     @ResponseBody78     @RequestMapping("/findAdmin")79     public List<Admin> findAdmin(@RequestParam(value="username",required=false) String username,80                                     @RequestParam(value="password",required=false) String password,81                                     @RequestParam("start") int start,82                                     @RequestParam("limit") int limit,83                                     HttpServletRequest request){84         Admin admin = AdminCookieUtil.getLoginCookie(request);85         if(admin == null){//未登录86             return null;87         }88         List<Admin> adminList = adminService.findAdmin(username, password, start, limit);89         return adminList;90     }91     92     /**93      * 插入一个用户并返回主键94      * 注意:get请求也会自动装配(即将前台传入的username和password传入admin)95      */96     @ResponseBody97     @RequestMapping("/insert")98     public Admin insertAdminWithBackId(Admin admin){99         return adminService.insertAdminWithBackId(admin);
100     }
101 }

说明,这个类只修改了两个方法login()和findAdmin()。

测试:

  • 向浏览器写入cookie

  • 从浏览器读cookie

注意:

  • 上述我们发了两个cookie,其中username的value没有加密,是因为这个value不是私密数据且我们在前台会直接使用,这样的话,省去了js解密的过程。

  • 对于allinfo的加密是为了在浏览器端不让用户将cookie看的那么明显,保护一些私密数据;或者在整个传输过程中,即使被窃听者获取了,也难以知道其中的cookie值。但是,如果窃听者获取了allinfo这个cookie后,就可以使用这个cookie模拟登录然后做一些操作,这个不知道cookie机制会怎样解决?(答案见最下方)

  • 对于allinfo的加密而言,仅使用AES加密事实上也不太合适,因为如果窃听者窃听到你的cookie后,对其进行篡改,当请求头再将这些信息传递过来的时候,可能经过json转化后就会是另一个Admin的信息了,如果需要防止这种情况发生,需要同时对cookie值进行消息摘要加密了(具体的消息摘要加密可以参照"Java加密与解密"系列博客),当然,在绝大多数情况下,如果窃听者不知道你的cookie值得话,如果他对这个值进行了随意的篡改,那么将来在将这个值进行解密后,对其转化成json的过程中就会抛出异常,因为解密后的json串很可能就不符合json的格式了,所以绝大多数情况下,仅适用于AES是可行的。

  • 对于cookie的name实际上也应该加密,加密后浏览器端或窃听者截到的cookie他就不知道是什么意思了,这个加密非常简单,直接在线下使用SHA256出一个字符串或者就使用上边所讲的AES的生成key的方法生成一个就好,然后写在name中,代码再列一遍:

    String key = Base64.encodeBase64String(AESUtil.getKey());
  • cookie不可以在多种浏览器之间共享,因为每个浏览器存cookie路径不是一样的

  • 同一种浏览器,多个标签页共享的话,需要再生成cookie的时候添加cookie的有效期;否则cookie为会话cookie,这种客户端是不会把cookie存到硬盘上的,其他标签也无法获取到cookie

总结:

  • 如果安全措施搞得好+cookie数量不多+cookie的总大小对带宽的占用可以接受,使用cookie(对于安全措施这一块,cookie被劫持的可能性一般不大,如果不是非常敏感的权限,可以使用记住我这些功能,如果对于敏感权限,例如金钱操作,就强制重新登录,类似于shiro)

  • 对于浏览器禁用cookie的事情,基本可以不考虑,绝大多数现代浏览器都不会禁用cookie。

疑问:

  • 如果被窃听者劫取到你的cookie,即使你对这些cookie做了加密,使其看不到cookie中的信息,但是其也可以通过该cookie模拟登录行为,然后获得一些权限,执行一些操作。(这是个疑问,记住我这个功能就是这样做的,怎样做到安全的呢?)

解答:方案

1、使用权限框架shiro

注意:shiroshiro保存了你的账户名(编码)和可记住密码的有效时间到cookie里,下次会把账户名带过来,可以允许执行一些非敏感操作。根据你后台设定的权限;当然对于敏感权限的话,一定要重新登录才行。(当然,由于还是存在cookie里,可能还是存在会被劫持的情况)

具体看下边图片:("记住我"的功能)

2、https(即使被劫取到,也不能重传)

这个是可以解决上边问题的,但是https没闹懂。

3、IP变动

1)客户端登陆的时候,记录客户端IP到数据库

2)下次登录从request中获取IP并与前一次记录的IP作对比,如果IP没有发生变化,则得直接进入已登录状态了;如果IP发生了变化,则重新登录,登录之后,修改IP

3)之后的过程如上

当然,对于以上这种方式,还有一种改进,就是将用户登录的IP放入缓存(当然可以指定缓存时间),这样每次就可以从缓存中查IP了。

但是这种方式有个问题,就是说同一台电脑换一个网络环境,这时候IP就变了,就得重新登陆了。

4、数字签名算法

数字签名的三个作用中的一个就是"认证数据来源",感觉这会是一个思路,但是具体怎么实现还没想好。如果大家有想好的,帮指点一下!

数字签名算法的具体实现见"Java加密与解密"《第十四章 数字签名算法--RSA》,链接如下:

http://www.cnblogs.com/java-zhao/p/5091363.html

有关于session的细节与解决方案,以后再说!

此文已由作者赵计刚授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

相关文章:
【推荐】 网易云基于 Kubernetes 的深度定制化实践
【推荐】 【工程实践】服务器数据解析
【推荐】 The Beam Model:Stream & Tables翻译(上)

转载于:https://www.cnblogs.com/163yun/p/10143319.html

企业项目开发--cookie(3)相关推荐

  1. 企业项目开发--分布式缓存memcached(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.ssmm0-data 结构: 3.3.1.pom.xml 1 <?xml version=&q ...

  2. 企业项目开发--切分配置文件

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 本章内容在第三章<Java框架整合--企业中的项目架构以及多环境分配>的代码上做修改,链接如下: ...

  3. 第四章 企业项目开发--切分配置文件

    本章内容在第三章<Java框架整合--企业中的项目架构以及多环境分配>的代码上做修改,链接如下: http://www.cnblogs.com/java-zhao/p/5115136.ht ...

  4. 企业项目开发--企业中的项目架构以及多环境分配(2)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 2.2.2.ssmm0-data pom.xml <?xml version="1.0&qu ...

  5. 企业项目开发中的问题

    1.用sql语句嵌入到代码中呢,还是全部用存储过程,放在一起好管理.   sql语句和存储过程如何选择呢,是不是简单的就直接用sql语句,复杂一点的用sp 2.uml图用什么软件画比较好一点呢.stu ...

  6. 企业项目开发中可遵循的时间管理守则-华为时间管理

  7. ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出...

    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出 前言:首先给大家说声"对不起",因为自从打算写这系列的文章以来,得到大家很多的支持 ...

  8. ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

    为什么80%的码农都做不了架构师?>>>    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发          前言:本篇主要讲述数据访问层的开发, ...

  9. 轻松玩转Makefile | 企业项目级Makefile实例

    前言 本文展示了一个比较完整的企业项目级别的Makefile文件,包括了:文件调用,源文件.头文件.库文件指定,软件版本号.宏定义,编译时间,自动目录等内容. 1.目录架构 本文中所采用的目录架构,在 ...

  10. 缺项目经验?线上实训机会来咯!!后端企业项目盖章实习,可写进简历

    软件行业近十余年得到了飞速的发展,互联网行业的高薪也不断吸引着优秀的人才选择进入软件开发岗位,即便近期整体招聘行情遇冷,但数字化的国家战略不会轻易改变,人才供给速度也仍未赶上技术发展的速度,因此软件开 ...

最新文章

  1. 数据结构与算法实验祝恩_《数据结构与算法》实验教学大纲
  2. 代码自解释不是不写注释的理由
  3. 牛客题霸 [矩阵查找] C++题解/答案
  4. 第十章 深入理解Session与Cookie
  5. CS100.1x Introduction to Big Data with Apache Spark
  6. 用java处理图片(压缩成小尺寸;加文字和logo水印)
  7. 一个普通的 Zepto 源码分析(一) - ie 与 form 模块
  8. 常用的html语言,常用的HTML语言标记
  9. 佳能打印机g3800如何安装到计算机,【佳能 G3800 喷墨无线一体打印机使用体验】驱动|安装|连接|连接_摘要频道_什么值得买...
  10. 群晖做网页服务器_群晖NAS服务器管理后台的登入教程
  11. 台式机linux系统安装教程,台式机Linux/Unix多系统安装详细教程
  12. 【mfc】解决鼠标钩子被占用焦点后不响应的问题
  13. windows 控制台cmd乱码的解决办法 chcp 65001
  14. 机器学习自动写诗-学习笔记
  15. 【老生谈算法】matlab实现图像放大算法——图像放大算法
  16. Autovue 21.0.2.4 发布
  17. 芒种节气的含义,都藏在这些芒种节气设计海报里啦!
  18. 程序设计入门C语言 --- 时间换算
  19. 学习计划和个人提升(一个月内完成)
  20. 汉语编程工具易语言即学即用教程pdf

热门文章

  1. 欧几里得算法和唯一分解定理
  2. 2021-06-21属性选择器
  3. 闪退没由报错_?秉承工匠精神,3步定位飞桨报错原因,你也来试试?
  4. latex 引用硕士论文、博士论文 bibtex格式
  5. Hyperledger Fabric的工作流程
  6. postges mysql_MySQL中on duplicate key update 在PostgesSQL中的实现方式
  7. python语法学习第十一天--迭代器
  8. JavaScript 求和(字符串转换成数组、for循环求和)
  9. 二十、Oracle学习笔记:编写存储过程
  10. 二、常量、变量和基本数据类型