Java Spring登录用户信息检索
我正在创建一个基本的SpringWeb应用程序,其中包括用户登录并输入他们的个人仪表板。当“登录”url通过控制器实例化时,我使用了默认的Spring安全登录表单。我想知道的是,如何检索刚刚从数据库登录的用户个人帐户信息? 这是当登录url被实例化时控制器类中的内容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());
@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。这不管用。你最好读一下文件,看看你上的是什么课。有不同的对象-主体
,身份验证
,我不记得具体是什么