Spring MVC之cookies跟session 数据绑定

在我最早接触web开发的中学时代,学习的asp技术对于session的概念其实很清楚

Session("username")="张三"
下次要用的时候,直接用session来取就OK了

由于http会话是无状态的,所以你不知道发来请求的是哪个客户,

所以数据需要绑定到每个用户的客户端上,最常用的技术就是 session跟cookies ,

Cookies持有本地信息(但是做服务端的一定不能通过cookies来简单验证用户权限,因为cookies会被篡改,最常见的是早期很多asp管理系统通过cookies来留存用户权限级别,然后简单地通过cookies来做业务逻辑验证,

也是可笑,那个时候我通过这个办法,用普通用户登录然后篡改cookies获得管理用户权限黑过某些个政府网站以及学校的成绩管理系统),

然后服务端(J2EE规范是JSEESIONID)这个是作为token存放在你的cookies里面的,每次在你关闭浏览器(也就是关闭所有TCP连接的时候,tomact服务器会默认这个token失效,在你下一次请求的时候会给你分配新的sessionid)

上面是截图

-------------------------------

http://www.cnblogs.com/liukemng/p/3736948.html 我是照这篇博客学习的数据绑定

下面讲springmvc的分段数据绑定,我今天早上一直没理解模型对象是在何时被框架请求进入内存调用 后来才搞清楚

 

@ModelAttribute("sessionaccountmodel")
    public AccountModel initAccountModel(){
        
        return new AccountModel();
    }

作为bean组件,它的生命周期最长是在session失效,也就是客户端浏览器关闭TCP连接的时候。

@RequestMapping(value="/usernamebind", method = {RequestMethod.GET})
    public String userNameBind( Model model, @ModelAttribute("sessionaccountmodel")AccountModel accountModel){
        System.out.println(accountModel.toString()+" 1");
        model.addAttribute("sessionaccountmodel", accountModel);
        return "usernamebind";
    }

    @RequestMapping(value="/usernamebind", method = {RequestMethod.POST})
    public String userNameBindPost( @ModelAttribute("sessionaccountmodel") AccountModel accountModel){
        
        //重定向到密码绑定测试
        System.out.println(accountModel.toString()+" 2");
        return "redirect:passwordbind";
    }

    @RequestMapping(value="/passwordbind", method = {RequestMethod.GET})
    public String passwordBind(@ModelAttribute("sessionaccountmodel") AccountModel accountModel){
        System.out.println(accountModel.toString()+" 3");
        if (accountModel.getUsername()==null){
            return "redirect:usernamebind";
        }
        return "passwordbind";
    }

    @RequestMapping(value="/passwordbind", method = {RequestMethod.POST})
    public String passwordBindPost(@ModelAttribute("sessionaccountmodel") AccountModel accountModel, SessionStatus status){
        System.out.println(accountModel.toString()+" 4");
        
        if (accountModel.getUsername()==null){//防止用户从passwordbing提交密码
            return "redirect:usernamebind";
        }
        //status.s
    
//status.setComplete(); //显示绑定结果 return "sessionmodelbindresult"; }

上面我分别打印了accountModel的toString方法返回了对象的地址,也就是说这个对象是一直存在的

 

在最后我注释了

  status.setComplete();

这个方法被注释后,你可以在 /passwordbing页面重新提交一次密码,然后你会看到页面并不会被跳转到/usernamebind 
原因在于一开始创建的模型在绑定在session中并没有被清空,
所以你单独提交一次密码,依然会显示你上次提交的用户名

 

posted on 2016-09-12 21:39  winters86  阅读(1814)  评论(0编辑  收藏  举报