先贴上controller的代码,关于session的我用红色字体标注出来

@Controller
@RequestMapping("/admin")
@SessionAttributes("userName")
public class AdminController {

@Autowired
    private AdminService adminService;

@SuppressWarnings("unused")
@RequestMapping(value="/cjyLogin",method = RequestMethod.POST)
public ModelAndView cjyLogin(@ModelAttribute("userInfoVo") UserInfo userInfo,Model model){
ModelAndView mav = new ModelAndView();
        UserInfo user = adminService.getUserInfoByPrimaryKey(userInfo.getUserPhone());
        if(userInfo!=null) {
        if(user!=null) {
        if(userInfo.getUserPwd().equals(user.getUserPwd())) {
               System.out.println("++++++++++++++++++++++=============="+user.getUserName()+user.getUserPhone());
                    UserInfo admin = adminService.getUserInfoByPrimaryKey(userInfo.getUserPhone());//这一步是根据前                                                                                                                                                            台传来的userPhone                                                                                                                                                          查询用户信息

model.addAttribute("userName", admin.getUserName());//将admin.getUserName()放进session中

mav.addObject("userName", admin.getUserName());
        mav.setViewName("main");
        }else {
                mav.setViewName("login");
                mav.addObject("message", "您的密码输入有误!");
        }
        }else {
            mav.setViewName("login");
            mav.addObject("message", "没有找到该用户!");
        }
        }else {
        mav.setViewName("login");
        mav.addObject("message", "没有获得您所输入的信息!");
        }
return mav;
}

@ResponseBody
@RequestMapping(value="/userList",method = RequestMethod.POST)
public List<UserInfo> userList(@ModelAttribute("userInfoVo") UserInfo userInfo) {
List<UserInfo> userList = adminService.selectAllUser();
return userList;
}

/**
* 退出登录
* @param session
* @param req
* @return 
*/
@ResponseBody
@RequestMapping(value="/userQuit",method = RequestMethod.POST)
public Map<String,Object> userQuit(HttpSession session,HttpServletRequest req){
         session = req.getSession();
         session.invalidate();
         Map<String,Object> map = new HashMap<>();       
         return map;
}

}

@ResponseBody                     //spring mvc返回json的注解

session = req.getSession();
session.invalidate();                   //先获得session,再注销

至于我为什么返回一个空的map,是因为我前台用的ajax,后台要返回数据,你也可以返回一个其他的数据

前台我用${sessionScope.userName}来获取session中的值,下面贴出前台代码

<span>${sessionScope.userName}</span>   //获取值

<span id="drop-out">退出</span>                  //点击后注销session并退出

//点击退出
        $("#drop-out").click(function(){        
        $.ajax({    
       url:'${pageContext.request.contextPath}/admin/userQuit.do',// 跳转到 action    
       data:{},    
       type:'post',    
       cache:false,    
       dataType:'json',    
       success:function(data) {        
        window.location.href = '<%=basePath%>login.jsp';        
        },    
        error : function() {    
             // view("异常!");    
             alert("数据异常!");    
        }    
    });
        })

这里我没用

<% session.invalidate();%>
         window.location.href = '<%=basePath%>login.jsp';

来注销session,因为javascript页面中好像不管有没有触发事件都会执行<% session.invalidate();%>,

但是用ajax方式会抛出一个异常:

严重: Servlet.service() for servlet [dispatcherServlet] in context with path [/CJY-shop] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot create a session after the response has been committed] with root cause
java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2789)
at org.apache.catalina.connector.Request.getSession(Request.java:2170)
at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:895)
at org.springframework.web.context.request.ServletRequestAttributes.getSession(ServletRequestAttributes.java:111)
at org.springframework.web.context.request.ServletRequestAttributes.setAttribute(ServletRequestAttributes.java:161)
at org.springframework.web.bind.support.DefaultSessionAttributeStore.storeAttribute(DefaultSessionAttributeStore.java:55)
at org.springframework.web.method.annotation.SessionAttributesHandler.storeAttributes(SessionAttributesHandler.java:124)
at org.springframework.web.method.annotation.ModelFactory.updateModel(ModelFactory.java:230)

网上有很多copy来copy去的文章,试了以后并没有解决这个问题,其实报这个问题的原因是:

在respon关闭后还是用了session,

就是ajax回调以后,返回到前端页面,而<span>${sessionScope.userName}</span> 又使用了一遍,但这个时候是没有session的。要去除这个异常大家可以试试c:if标签,

有更好的解决方式希望大家能贴出来,非常感谢,希望能互相学习

spring mav创建和注销session相关推荐

  1. [Java][web]利用Spring随时随地获得Request和Session

    利用Spring随时随地获得Request和Session 一.准备工作: 在web.xml中加入 <listener> <listener-class> org.spring ...

  2. Spring Security MVC登录注销示例教程

    Spring Security MVC登录注销示例教程 今天我们将了解Spring Security Login Example.在阅读这篇文章之前,请先阅读我在"Spring 4 Secu ...

  3. Flask11 Session、CSRF、注销session、利用端点自动跳转

    1 怎么对存储的cookie数据进行加密 利用response对象去设置cookie时,存储到浏览器中的cookie数据都是明文的,容易被一些计算机爱好者利用:利用session存的cookie数据可 ...

  4. 【Spring 工厂】反转控制与依赖注入、Spring工厂创建复杂对象3种方式

    反转控制与依赖注入 反转控制 与 依赖注入 反转控制(IOC Inverse of Control) 依赖注入 (Dependency Injection - DI) Spring工厂创建复杂对象(3 ...

  5. spring bean创建过程源码分析(上)

    大家好,我是@zzyang(小卓),一个热爱技术的90后.这篇文章主要是带大家了解一下spring bean的生命周期,对spring bean的创建过程源码分析.由于篇幅有限,这里说的都是主干流程, ...

  6. oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...

    天萃荷净 创建表时报session超过最大值 证明递归session存在并不在v$session中显示 我们在数据库的使用过程中,有时候会遇到类似情况,我会话是登录的,但是我进行某种操作,缺报sess ...

  7. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  8. 在 Spring中 创建 JavaBean

    2019独角兽企业重金招聘Python工程师标准>>> 在 Spring中 创建 JavaBean Spring 框架的最核心功能之一是 DI (Dependency Injecti ...

  9. spring cloud教程之使用spring boot创建一个应用

    <7天学会spring cloud>第一天,熟悉spring boot,并使用spring boot创建一个应用. Spring Boot是Spring团队推出的新框架,它所使用的核心技术 ...

最新文章

  1. 使用Node.js写一个简单的api接口
  2. 概率主题模型简介 Introduction to Probabilistic Topic Models
  3. 线性结构(顺序存储和链式存储)和非线性结构的特点及区别
  4. leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
  5. linux中Python3 引入CV2报错
  6. Atitit 知识搜索 信息检索的方法总结 目录 1. 目录搜索 1 1.1. 向下同级搜索 1 1.2. 向上目录抽象搜索 1 2. hash搜索模式 1 2.1. 关键词搜索 主题搜索 1 2
  7. pycharm生成linux可执行程序,Pycharm生成可执行文件.exe的实现方法
  8. PFC(Power Factor Correction)功率因数校正电路
  9. java 锁定excel单元格格式化,JXL实现Excel单元格锁定
  10. matplotlib论文图片配色
  11. Google 创始人
  12. Windows 10 2018年四月更新版官方正式版
  13. 用决策树预测获胜球队
  14. 《你可以不平凡》-- 周杰伦在北京大学百年讲堂的演讲
  15. 使用cmd(命令提示符)打开文件磁盘或者文件夹
  16. CT与DR双能X射线物质识别算法实现与应用(工业选煤、稀土分拣、毒爆检测、垃圾分类等)
  17. WordPress插件 WP Rocket 缓存火箭加速优化插件 [更新至v2.7.4]
  18. win10点击任务栏图标无法最小化应用
  19. debug(3)--kali gnome桌面图标无法显示
  20. chrome谷歌浏览器怎么开启flash插件

热门文章

  1. 浅谈 TS 标称类型介绍及社区实现
  2. 宽带码分多址系统中多径衰落与多址干扰的影响
  3. 魔力宝贝服务器端文件介绍,魔力宝贝里的一些文件说明
  4. 路由器里的DHCP是什么?如何开启路由器DHCP?
  5. uva 12012 - Detection of Extraterrestrial(KMP)
  6. POJ3164 最小树形图 有向图的最小生成树 模板题 朱刘算法 朱永津-刘振宏算法
  7. Android studio 光标变粗的解决方法
  8. Centos8修改源并更新
  9. 一文读懂程序化易法易化资频易计利
  10. view \function\行转列的方法。