如何在一个控制器中访问SpringMVC中的另一个控制器的会话变量?

时间:2018-01-22 12:03:35

标签: java spring spring-mvc session

我有一个登录控制器,我定义了一个会话变量,现在我想在我的应用程序的所有剩余控制器中访问该会话变量?

这是我的登录控制器代码段

@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代码段

@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中得到了空指针。

2 个答案:

答案 0 :(得分:0)

我找到了符合我要求的解决方案。 实际上,我的要求是从登录控制器访问会话值到配置文件控制器。 所以我所做的不是在配置文件控制器中访问会话变量,而是在登录控制器中调用一个将返回所需值的方法。

@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");
}
}

ProfileController可

@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() 如果任何会话与请求相关联将返回的方法然后它将返回该会话,否则它将创建新会话。我的配置文件控制器中也应用了相同的概念。 而不是访问现有会话将创建新会话,因为两者是两个不同的请求。 出于这个原因,我按照上面的代码摆脱了我的要求。

答案 1 :(得分:0)

如果与当前登录的用户名有关,则只需将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";

}