如何将一个控制器中的会话变量访问到 SpringMVC 中的另一个控制器?
Posted
技术标签:
【中文标题】如何将一个控制器中的会话变量访问到 SpringMVC 中的另一个控制器?【英文标题】:How to access the session variable in one controller to the other controller in SpringMVC? 【发布时间】:2018-07-01 01:28:22 【问题描述】:我有一个登录控制器,因为我定义了一个会话变量,现在我想在我的应用程序的所有剩余控制器中访问该会话变量?
这是我的登录控制器代码 sn-p
@RequestMapping(value = "/login", method = RequestMethod.POST,produces = "application/json")
public @ResponseBody Map<String, String> validateUser(@RequestBody String loginParameters,HttpServletRequest request) throws Exception
try
HttpSession session=request.getSession();
JSONObject json = new JSONObject(loginParameters.trim());
String un=json.getString("username");
session.setAttribute("username", un);
这是我的 ProfileController 代码 sn-p
@Controller
public class ProfileController
@RequestMapping(value = "/getUserData", method = RequestMethod.GET,produces = "application/json")
public @ResponseBody Map<String, String> getUser(HttpServletRequest req) throws Exception
try
HttpSession session=req.getSession();
String loggedInUser=(String)session.getAttribute("username");
System.out.println("UserName is "+ loggedInUser);
现在我想在我的另一个配置文件控制器中访问这个会话变量(用户名)。我试过这样,但我在 ProfileController 中得到了空指针期望。
【问题讨论】:
使用sesssion.getAttribute("key")
。
session.getAttribute("username")
在同一个控制器中,我们可以访问 session.getAttribute("key") 但在这个控制器之外我们如何获得相同的会话引用?
你试过了吗?这就是它被称为会话的原因,它将在整个用户会话中可用。
Following link contains the complete steps of how to manage sessions in spring mvc
【参考方案1】:
我找到了满足我要求的解决方案。 实际上,我的要求是从登录控制器访问会话值到配置文件控制器。 所以我所做的不是访问配置文件控制器中的会话变量,而是调用登录控制器中的一个方法,该方法将返回我所需的值。
@Controller
public class LoginController
private HttpSession session=null;
@RequestMapping(value = "/login", method = RequestMethod.POST,produces = "application/json")
public @ResponseBody Map<String, String> validateUser(@RequestBody String loginParameters,HttpServletRequest request) throws Exception
try
session=request.getSession();
JSONObject json = new JSONObject(loginParameters.trim());
String un=json.getString("username");
session.setAttribute("username", un);
catch(Exception e)
public String getUserName()
return session.getAttribute("username");
配置文件控制器
@Controller
public class ProfileController
@Autowired
private LoginController loginControllerObj;
@RequestMapping(value = "/getUserData", method = RequestMethod.GET,produces = "application/json")
public @ResponseBody Map<String, String> getUser(HttpServletRequest req) throws Exception
try
String loggedInUser=loginControllerObj.getUserName();
System.out.println("UserName is "+ loggedInUser);
根据我的理解,在我的问题中。我在 Profile 控制器中遇到空指针异常,这是因为如果我们想访问会话,那么我们需要调用 request.getSession() 如果任何会话与请求相关联,则将返回的方法,如果没有,它将返回该方法,然后创建一个新会话。我的配置文件控制器中的相同概念也适用。 不是访问现有会话,而是创建新会话,因为两者都是两个不同的请求。 出于这个原因,我按照上面的代码摆脱了我的要求。
【讨论】:
【参考方案2】:如果是关于当前登录的用户名,那么你只需将 Principal 参数传递给控制器方法。
@RequestMapping(value="/login", method = RequestMethod.GET)
public String methodName(ModelMap model, Principal principal )
String name = principal.getName(); //get logged in username
model.addAttribute("username", name);
return "page";
【讨论】:
以上是关于如何将一个控制器中的会话变量访问到 SpringMVC 中的另一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章