Java Spring登录用户信息检索

Java Spring登录用户信息检索,java,spring,jsp,spring-mvc,spring-security,Java,Spring,Jsp,Spring Mvc,Spring Security,我正在创建一个基本的SpringWeb应用程序,其中包括用户登录并输入他们的个人仪表板。当“登录”url通过控制器实例化时,我使用了默认的Spring安全登录表单。我想知道的是,如何检索刚刚从数据库登录的用户个人帐户信息? 这是当登录url被实例化时控制器类中的内容 @RequestMapping("dashboard") public String goDashboard(Model model){ model.addAttribute("user", new User());

我正在创建一个基本的SpringWeb应用程序,其中包括用户登录并输入他们的个人仪表板。当“登录”url通过控制器实例化时,我使用了默认的Spring安全登录表单。我想知道的是,如何检索刚刚从数据库登录的用户个人帐户信息? 这是当登录url被实例化时控制器类中的内容

@RequestMapping("dashboard")
public String goDashboard(Model model){
    model.addAttribute("user", new User());
    return "dashboard"; // this is just returning the viewResolver JSP page
}

我假设上面的说法是错误的,因为我个人认为创建一个新对象是错误的,并且会给我空值。当我使用登录并尝试显示时:
不会显示任何内容。

如果创建新的
用户
对象,则用户名肯定为空(如果您只有空的默认构造函数)。 您可以通过以下方式在jsp中获取用户名:

<sec:authentication property="principal.username" /> 

别忘了在顶部添加声明:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>


阅读更多关于它的信息

如果您创建了新的
用户
对象,则用户名肯定为空(如果您只有空的默认构造函数)。 您可以通过以下方式在jsp中获取用户名:

<sec:authentication property="principal.username" /> 

别忘了在顶部添加声明:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>


阅读更多关于它的信息

你可以通过各种方式获得它

1) 使用:

然后像现在一样把它放到模型中

2) 使用:

//将呈现名称

在这种情况下,您不需要向控制器添加任何代码。

您可以通过各种方式获得它

1) 使用:

然后像现在一样把它放到模型中

2) 使用:

//将呈现名称

在这种情况下,您不需要向控制器添加任何代码。

或者您可以在控制器中获取代码:

@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
    model.addAttribute("username", principal.getName());
    return "dashboard"; 
}
这种方法将帮助您在控制器中保持业务逻辑(关注点分离)

编辑。传递用户详细信息对象:

@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
    UserDetails userDetails = (UserDetails)((Authentication)principal).getPrincipal()
    model.addAttribute("userDetails", userDetails);
    return "dashboard"; 
}

或者,您可以在控制器中获取:

@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
    model.addAttribute("username", principal.getName());
    return "dashboard"; 
}
这种方法将帮助您在控制器中保持业务逻辑(关注点分离)

编辑。传递用户详细信息对象:

@RequestMapping("dashboard")
public String goDashboard(Model model, Principal principal){
    UserDetails userDetails = (UserDetails)((Authentication)principal).getPrincipal()
    model.addAttribute("userDetails", userDetails);
    return "dashboard"; 
}


杰出的成功了,谢谢你。这是正确的实施方式吗?还是在控制器中创建一个主对象更好?@user2660806这是正确的。如果需要在控制器中获取主体,只需添加参数
principal-principal
。非常好!成功了,谢谢你。这是正确的实施方式吗?还是在控制器中创建一个主对象更好?@user2660806这是正确的。如果需要在控制器中获取主体,只需添加参数
principal-principal
。非常感谢!在这种情况下,我是否仅限于显示用户名?或者我可以通过这种方式访问所有数据库字段吗?例如:密码、电子邮件、传记等等。当然,您可以将完整的用户数据文件对象传递到您的视图中。我的答案已更新。我仍然无法从数据库中获取要显示的其他值。在实现上述代码后,我只能像这样显示我的“username”:但是如果我尝试使用“userDetails.email”的同一个coed,它将不起作用,并且我得到JasperException错误500代码。您是否使用自定义userDetails对象?是否有额外的电子邮件字段?这个字段是在自动验证期间填充的?我刚刚实现了您在编辑的代码段中上面写的内容,并在(身份验证)principal.getPrincipal()之前强制转换了(UserDetails);太好了,谢谢!在这种情况下,我是否仅限于显示用户名?或者我可以通过这种方式访问所有数据库字段吗?例如:密码、电子邮件、传记等等。当然,您可以将完整的用户数据文件对象传递到您的视图中。我的答案已更新。我仍然无法从数据库中获取要显示的其他值。在实现上述代码后,我只能像这样显示我的“username”:但是如果我尝试使用“userDetails.email”的同一个coed,它将不起作用,并且我得到JasperException错误500代码。您是否使用自定义userDetails对象?是否有额外的电子邮件字段?这个字段是在自动验证期间填充的?我刚刚实现了您在编辑的代码段中上面写的内容,并在(身份验证)principal.getPrincipal()之前强制转换了(UserDetails);谢谢看起来我可以使用几个选项。我唯一的问题是什么是最正确的方法?(保持MVC)并且通过使用“我仅限于从数据库获取2个数据库字段”是否正确?如果您100%确定您只需要2个字段-您可以使用taglibs,不用担心。如果我需要超过2个字段,该怎么办?我尝试用:加载所有数据库字段,但将“username”更改为相应的字段,结果返回null。这不管用。你最好读一下文件,看看你上的是什么课。有不同的对象-
主体
身份验证
,我不记得它们之间的确切区别。此外,这对您来说也是一个很好的练习。如果您需要两个以上的字段,或者您需要具有主体的复杂逻辑,那么您应该在控制器中使用它。IMHO,
sec:authentication
不是一种MVC方式,因为您在JSP上有逻辑,而不是使用模型。但对于简单的情况,这就足够了。所以最后的答案是“这取决于…”谢谢!看起来我可以使用几个选项。我唯一的问题是什么是最正确的方法?(保持MVC)并且通过使用“我仅限于从数据库获取2个数据库字段”是否正确?如果您100%确定您只需要2个字段-您可以使用taglibs,不用担心。如果我需要超过2个字段,该怎么办?我尝试用:加载所有数据库字段,但将“username”更改为相应的字段,结果返回null。这不管用。你最好读一下文件,看看你上的是什么课。有不同的对象-
主体
身份验证
,我不记得具体是什么