先贴上controller的代码,关于session的我用红色字体标注出来
@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标签,
有更好的解决方式希望大家能贴出来,非常感谢,希望能互相学习