如何在jsp中显示当前用户?

时间:2015-07-28 17:44:10

标签: spring-mvc logging spring-security

我是Spring Mvc的新手,我刚刚使用spring security完成了用户身份验证,我希望已登录的用户显示在主页(“userX已连接”之类的消息)并记录日志记录的所有用户 你能帮助我吗 ? 有任何想法吗 ?

1 个答案:

答案 0 :(得分:7)

请求属性

建议的做法是将一个带有用户名值的请求属性添加到请求中。优点是,这使您与Spring Security脱钩。如果您决定删除Spring Security,则您的视图不会受到影响。在Spring MVC中,您可以使用以下内容填充请求属性:

@RequestMapping("/home")
public String home(Principal principal, Model model) {
    if(principal != null) {
        model.addAttribute("username", principal.getName());
    }
}

在标准Servlet环境中(即不使用Spring MVC),您只需使用

即可
if(principal != null) {
    httpServletRequest.setAttribute("username", principal.getName()); 
}

然后在JSP中,您可以使用以下内容显示它:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:out value="${username}"/>

注意:使用标记库输出用户名以避免XSS问题极为重要。不使用$ {username}而不将其放在taglib中或确保正确转义该值。

大多数时候,用户希望能够将用户名添加到每个页面。您可以使用@ModelAttribute & @ControllerAdvice在Spring MVC 3.2+中轻松完成此操作。例如:

@ControllerAdvice
public class UserControllerAdvice {
    @ModelAttribute("username")
    public String username(Principal principal) {
        return principal == null ? null : principal.getName();
    }
}

从HttpServletRequest

访问

Spring Security将用户公开为标准HttpServletRequest.getUserPrincipal()上的Principal(这实际上是我们在Spring MVC示例中解析Principal的方式)和HttpServletRequest.getRemoteUser()方法。这意味着您还可以在HttpServletRequest中访问JSP中的用户。这意味着您还可以使用:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<c:out value="${pageContext.request.remoteUser}"/>

Spring Security taglib

另一种方法是使用Spring Security JSP tag lib(已经指出)。例如

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

记录身份验证尝试

您可以通过实现ApplicationListener并将其作为bean公开来记录身份验证尝试。 Spring Security提供了一个名为LoggerListener的实现。要使用它,请在配置中添加以下内容:

<b:bean class="org.springframework.security.authentication.event.LoggerListener"/>

您也可以提供自己的实施方案。以下是它的外观概述:

public class MyListener implements ApplicationListener<AbstractAuthenticationEvent> {

    public void onApplicationEvent(AbstractAuthenticationEvent event) {
        // do something
    }
}