今天做博客demo的時候遇到了這樣的問題:當我用ajax進行資源請求時,需要順便將賬戶信息存入session。但是后來發現有@Responsebody標簽時,直接用HttpSession存數據時,根本沒有效果。代碼如下:
@ResponseBody @RequestMapping("/checkInfo") public Blogger dealWithLogin(@RequestBody Blogger blogger,HttpSession httpSession){ if(blogger.getBloggerMail() != null) { blogger = bloggerServices.checkInfo(blogger); if(!blogger.equals("")){ httpSession.setAttribute("blogger",blogger); } } return blogger; }
在jsp頁面中取值取不到。那么是不是我的寫法有問題呢(不考慮標簽問題),我做了一個簡單的測試
@Controller @RequestMapping("/test") public class TestController { @RequestMapping("/m1") public String m1(HttpSession httpSession){ httpSession.setAttribute("sessionTest","session ........"); return "test"; } }
跳轉頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body> ${sessionScope.sessionTest} </body>
</html>
得到結果
發現可以得到結果,那么這個測試程序與我之前所寫的程序有何區別呢?
當然是返回值類型不一樣了,前者通過@ResponseBody標簽指定返回的是json類型,而后者直接跳轉頁面。
那么是不是意味着,有@ResponseBody標簽,就不能使用session了呢?
后來查閱發現,還是要使用spingmvc自帶的組件,@SessionAttributes。代碼如下:
package com.ph.controller;import javax.servlet.http.HttpSession; @SessionAttributes(value = {"blogger"}) @RequestMapping("/blogger") @Controller public class BloggerController { @Autowired private BloggerServices bloggerServices;
@ResponseBody @RequestMapping("/checkInfo") public Blogger dealWithLogin(@RequestBody Blogger blogger, Model model,HttpSession httpSession){ if(blogger.getBloggerMail() != null) { blogger = bloggerServices.checkInfo(blogger); if(!blogger.equals("")){ model.addAttribute("blogger",blogger); } } return blogger; } }
public Blogger dealWithLogin(@RequestBody Blogger blogger, Model model,HttpSession httpSession)中的HttpSession httpSession務必要加上,不然會報錯。
@SessionAttributes(value = {"blogger"}) 含義:model添加一個名為blogger的變量時,也會在session中加一個。
注:記錄一下解決方案,原理日后探究,有錯誤還請大佬們指正,感謝。