发表于: 2020-08-04 23:26:36

1 1314


先实现基本功能。。

@RequestMapping(value "login")
public String login(Account accountModel modelHttpServletRequest httpServletRequestHttpServletResponse httpServletResponse) throws Exception{

logger.info("加密前的信息:"+account);

   if (account.getUsername() != null && account.getPassword() != null) {
//将密码通过MD5进行加密
       String passwordMD5 = MD5Util.stringToMD5(account.getPassword());
       account.setPassword(passwordMD5);
       logger.info("加密后的信息:"+account);

       Account account1 = accountService.select(account);
       //验证账号密码是否正确
       if ( account1 != null) {
logger.info("登录成功");
           Long id = account1.getId();//根据用户名获取id
           //使用系统当前时间生成唯一token,格式为键值对
           String token = id + "=" + System.currentTimeMillis();
           //使用DES加密
           String tokenDES =DESUtils.getEncryptString(token);
           logger.info("加密后的token:" + tokenDES);
           //保存到cookies中
           Cookie cookie = new Cookie("token",tokenDES);
           //设置cookie过期时间 单位为秒
           cookie.setMaxAge(7000);
           //设置cookie有效路径
           cookie.setPath("/");
           httpServletResponse.addCookie(cookie);
           model.addAttribute("username"account.getUsername());

           //httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/u/profession");
           return "redirect:/u/profession";
       else {
model.addAttribute("error""账号或密码错误");//如果账号密码错误则提示该消息
           //httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login");
           return "login";
       }
else {
model.addAttribute("error","请先登录");//如果未登录就访问/u/profession则提示该消息
       httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login");
       return "login";
   }
}
/**
* 自定义拦截器
*/
public class MyInterceptor1 implements HandlerInterceptor {

@Autowired
   AccountService accountService;

   private static Logger logger = LogManager.getLogger(MyInterceptor1.class);

   public boolean preHandle(HttpServletRequest httpServletRequestHttpServletResponse httpServletResponseObject handler) throws Exception {
// 判断session
       Cookie[] cookies = httpServletRequest.getCookies();
       logger.info("Cookie长度为: " + cookies.length);
       logger.info("拦截器获取到的Cookie: " + String.valueOf(cookies));
       if (cookies != null) {
logger.info("开始遍历");
           // 遍历
           for (Cookie cookie : cookies) {
logger.info("当前cookie的值: " + cookie.getValue() + " 名字为:" + cookie.getName());
               // 判断是否有token
               if (cookie.getName().equals("token")) {
String tokenDES = cookie.getValue();
                   logger.info("tokenDES: " + tokenDES);

                   String token = DESUtils.getDecryptString(tokenDES);//解密
                   logger.info("token的解密value:" + token);

                   // 分割字符串 获取id
                   Long id = Long.valueOf(token.split("=")[0]);
                   logger.info("id为: " + id);
                       return true;
               }
}
}
// token验证失败 跳回登陆页面
       // httpServletRequest https://blog.csdn.net/gris0509/article/details/6340987
       httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/tologin");
       return false;
   }
}

cookie:

Cookie是由服务器端生成,发送给User-Agent,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器。


Cookie的处理分为:

服务器像客户端发送cookie,浏览器将cookie保存,之后每次http请求浏览器都会将cookie发送给服务器端。


发送cookie:

服务器端向客户端发送Cookie是通过HTTP响应报文实现的,在Set-Cookie中设置需要像客户端发送的cookie,cookie格式如下:

Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure"

其中name=value是必选项,其它都是可选项。Cookie的主要构成如下:

name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。

value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码

domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:

yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).

path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。

expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。

max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。

HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。

secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置。


服务器端解析cookie

cookie可以设置不同的域与路径,所以对于同一个name value,在不同域不同路径下是可以重复的,浏览器会按照与当前请求url或页面地址最佳匹配的顺序来排定先后顺序。所以当前端传递到服务器端的cookie有多个重复name value时,我们只需要最匹配的那个,也就是第一个。


客户端的存取

浏览器将后台传递过来的cookie进行管理,并且允许开发者在JavaScript中使用document.cookie来存取cookie。但是这个接口使用起来非常蹩脚。它会因为使用它的方式不同而表现出不同的行为。

当用来获取属性值时,document.cookie返回当前页面可用的(根据cookie的域、路径、失效时间和安全设置)所有的字符串,字符串的格式如下:

"name1=value1;name2=value2;name3=value3";

当用来设置值的时候,document.cookie属性可设置为一个新的cookie字符串。这个字符串会被解释并添加到现有的cookie集合中。


梳理一下流程

github上找到一个shiro整合SSM的准备敲敲试试

明日计划 任务5


返回列表 返回列表
评论

    分享到