用户图片在Java项目的标题部分,带有Spring和Thymeleaf



我正在开发带有春季和百里叶的Java项目。我已经为用户配置了一个工作类,该工作类存储了一个存储在服务器上的图片的字符串。它可以正常工作,我成功地将其调用。在项目的上部,我有一个导航面板,该小组在HTML的标题部分中进行了描述。完整的HTML看起来像这样:layout.html:

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head th:include="fragments/head" th:with="pageTitle='Java Project'"></head>
<body>
<header th:include="fragments/header"></header>
<main th:include="${view}"></main>
<footer th:include="fragments/footer"></footer>
<span th:include="fragments/scripts-bundle"></span>
</body>
</html>

现在,我按照所提供的高码在定义视图变量的主块中成功调用user.picture。这是一个有效的例子:

这是主要块中的视图:

……
<th:block th:each="user : ${users}">
    <tr th:class="${user.isAdmin() ? 'info' : null}">
    …………
    <td> <img class="img-circle" th:src="@{/images/users/{picture}(picture=${user.picture})}" height="43" width="43"/></td>
………
</tr>
</th:block>
……

控制器中的这一部分调用了视图:

@GetMapping("/")
public String listUsers(Model model){
List<User> users = this.userRepository.findAll();
model.addAttribute("users", users);
model.addAttribute("view", "admin/user/list");
return "layout";
}

在用户类中,我有:

….
private String picture;
public String getPicture() {
    return picture;
}
public void setPicture(String picture) {
    this.picture = picture;
}
…..

一切正常。

现在,我想在视图中调用相同的代码,但是要在描述导航面板的片段/标头部分中进行操作。我不能成功地做到这一点。根据我的谦虚知识,我看到了两种方法:

1/在胸腺视图中通过控制器代码注入用户:尝试了类似:

@GetMapping("/fragments/header")
@PreAuthorize("isAuthenticated()")
public String setPicHead(Model model){
    UserDetails principal = (UserDetails) SecurityContextHolder.getContext()
            .getAuthentication()
            .getPrincipal();
    User user = this.userRepository.findByEmail(principal.getUsername());
    model.addAttribute("user", user);
    model.addAttribute("fragments/header", user);
    return "fragments/header";
}
In the fragments/header html I added:
<li sec:authorize="isAuthenticated()">
    <img class="img-circle" th:src="@{/images/users/(picture=${user.picture})}" height="43" width="43"/>
</li>

根本不起作用并锁定整个项目

2/我想第二种方法是使用胸腺功能独立调用用户。我猜可以做到这一点,因为百里叶具有完整的发动机功能。

有人可以帮我吗?预先感谢您。

我找到了解决方案:

在此处注入:

@GetMapping("/")
public String index(Model model) {
    UserDetails principal = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    User user = this.userRepository.findByEmail(principal.getUsername());
    model.addAttribute("user", user);
    model.addAttribute("view", "home/index");
    return "layout";
}

在标题部分中,就像这样:

<li sec:authorize="isAuthenticated()">
                        <img class="img-circle" th:src="@{/images/users/{one}(one=${user.picture})}" height="49" width="49"/>
                    </li>

我会很高兴,如果有人在百里美中与直接身份验证共享解决方案。

最新更新