如何将一个控制器中的会话变量访问到 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 中的另一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章

无法访问 Kohana 控制器中的会话变量

如何将会话变量连接到 Django 中的登录用户?

如何在 jinja 2 - Flask 中访问会话变量

如何在 grails 中使用会话

如何将数组数据从控制器发送到刀片并访问 javascript 变量中的数据

PHP MVC 最佳实践 - 将 Session 变量从控制器传递给模型类或直接在模型中访问