在 spring + angular 中获取当前登录用户

Posted

技术标签:

【中文标题】在 spring + angular 中获取当前登录用户【英文标题】:Getting current logged user in spring + angular 【发布时间】:2016-07-18 20:43:30 【问题描述】:

我在我的 Spring Boot 应用程序中使用 Spring Security,我想从 Principal#getName 获取当前登录的用户,但我有一个模板解析错误,它包含我想要获取的用户名。

这是我的控制器:

import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class PageController 

   @RequestMapping(value = "/api/loggeduser", method = RequestMethod.GET)
   public String printWelcome(ModelMap model, Principal principal) 
        String name = null;
        if (principal !=null) 
            name = principal.getName();
        
        model.addAttribute("username", name);

        return name;
    


这是我获取登录用户的 AngularJs 函数:

app.controller('Usercontr', function($scope, $http) 
    $http.get("/api/loggeduser").success(function (data) 
        $scope.nom = data;  
        console.log($scope.nom) 
    )
);

这是错误:

解析模板“kamel.mili”时出错,模板可能不存在或 任何配置的模板解析器都可能无法访问

Kamel.mili 是登录的用户名。你能帮我么。我仅将百里香用于登录页面,其他一切都是 html + AngularJs。我不知道为什么 thymeleaf 会把它放在这个控制器上。

【问题讨论】:

【参考方案1】:

给你的控制器添加@ResponseBody注解:

@ResponseBody
@RequestMapping(value = "/api/loggeduser", method = RequestMethod.GET)
public String printWelcome(ModelMap model, Principal principal )  ... 

当您使用@Controller 构造型注解时,Spring MVC 将尝试将您的String 返回值解析为View,因此会出现错误:

解析模板“kamel.mili”时出错,模板可能不存在或 任何配置的模板解析器都可能无法访问

如果您只想将返回值写入响应正文,您可以将控制器设为 @RestController 或使用 @ResponseBody 注释特定控制器。

这有点离题了,但是由于您使用的是客户端视图渲染,所以 ModelMap 非常没用。您可以放心地摆脱它。

【讨论】:

看来我在检索无法解析的数据时遇到问题,是吗【参考方案2】:

您需要执行以下操作:

@RequestMapping(value = "/api/loggeduser", produces =MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity<String> findMessagesForUser(Principal principal) 
        return new ResponseEntity<String>(principal.getName(), HttpStatus.OK);

或者您可以使用响应构建器:

@RequestMapping(value = "/api/loggeduser", produces =MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity<String> findMessagesForUser(Principal principal) 
        return ResponseEntity.ok(principal.getName());

【讨论】:

【参考方案3】:

如果您已正确配置模板解析器,那么您应该检查您的模板。 printWelcome() 的返回字符串应该与在您的视图/模板文件夹中创建的视图之一匹配。在您的情况下,您将自己返回用户名,我想它应该是欢迎类型的页面。

【讨论】:

以上是关于在 spring + angular 中获取当前登录用户的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Security 的 Angular 2 应用程序并从 Spring REST 服务中获取数据

如何在angular6中使用打字稿获取当前年份

Angular 从 JWT 获取 Spring 角色

如何在 Angular 中获取当前的路由段(不是完整的 url)

如何在 Angular 8 或 javascript 中明智地获取当前日期每周日

Angular 从 Spring RestController 获取图像并缓存它