spring mav创建和注销session

Spring MVC Session管理
本文介绍了一个使用Spring MVC框架实现用户登录验证及Session管理的应用案例,包括登录验证逻辑、Session存储和销毁过程,并解决了Ajax请求下Session操作导致的异常问题。

先贴上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标签,


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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值