You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS+SpringBoot登录后获取用户信息并跳转页面问题

嘿,你已经把认证的基础功能搭好了,接下来只要把后端返回的用户信息利用起来,就能实现登录后跳转到用户车辆页面啦!我帮你梳理一下具体的修改步骤:

1. 调整后端接口,返回包含userId的用户信息

你当前的AuthenticationController只返回了Principal,但这个对象通常只包含用户名,没有直接的userId。我们可以修改接口,返回包含userId的自定义数据结构:

@RestController
public class AuthenticationController {

    // 假设你有一个UserService用来根据用户名查询用户ID
    @Autowired
    private UserService userService;

    @RequestMapping("/user-login")
    @ResponseBody
    public Map<String, Object> login(Principal principal) {
        // 从SecurityContext获取当前登录的用户详情
        UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        // 根据用户名查询用户ID(这里替换成你实际的查询逻辑)
        Long userId = userService.getUserIdByUsername(userDetails.getUsername());
        
        // 组装要返回的用户信息
        Map<String, Object> userInfo = new HashMap<>();
        userInfo.put("userId", userId);
        userInfo.put("username", userDetails.getUsername());
        
        return userInfo;
    }

    // 额外加一个接口,供前端在页面刷新时获取当前用户信息(可选但推荐)
    @RequestMapping("/current-user")
    @ResponseBody
    public Map<String, Object> getCurrentUser(Principal principal) {
        return login(principal); // 复用上面的逻辑即可
    }
}

2. 改造前端认证服务,存储用户信息

修改AuthenticationService,在登录成功后把后端返回的用户信息保存下来,方便后续页面使用:

angular.module('app')
 .constant('LOGIN_ENDPOINT', '/user-login')
 .constant('LOGOUT_ENDPOINT', '/user-logout')
 .service('AuthenticationService', function($http, LOGIN_ENDPOINT, LOGOUT_ENDPOINT) {
 // 用这个变量存储当前登录用户的信息
 this.currentUser = null;

 this.authenticate = function(credentials, successCallback) {
 var authHeader = {Authorization: 'Basic ' + btoa(credentials.email+':'+credentials.password)};
 var config = {headers: authHeader};
 $http
 .post(LOGIN_ENDPOINT, { }, config)
 .then(function success(res) {
 $http.defaults.headers.post.Authorization = authHeader.Authorization;
 // 把后端返回的用户信息存到service里
 this.currentUser = res.data;
 // 调用回调时把用户信息传过去
 successCallback(res.data);
 }.bind(this), function error(reason) {
 console.log('Login error');
 console.log(reason);
 });
 }

 this.logout = function(successCallback) {
 delete $http.defaults.headers.post.Authorization;
 // 登出时清空用户信息
 this.currentUser = null;
 successCallback();
 }
 });

3. 修改登录控制器,实现跳转逻辑

在AuthenticationController的登录成功回调里,拿到userId后直接跳转到/user-cars/:userId页面:

angular.module('app')
 .controller('AuthenticationController', function($rootScope, $location, AuthenticationService) {
 var vm = this;
 vm.credentials = {};

 var loginSuccess = function(userInfo) {
 $rootScope.authenticated = true;
 // 把用户信息同步到rootScope,方便其他组件直接使用(可选)
 $rootScope.currentUser = userInfo;
 // 跳转到用户车辆页面,拼接userId参数
 $location.path('/user-cars/' + userInfo.userId);
 }

 vm.login = function() {
 AuthenticationService.authenticate(vm.credentials, loginSuccess);
 }

 var logoutSuccess = function() {
 $rootScope.authenticated = false;
 $rootScope.currentUser = null;
 $location.path('/');
 }

 vm.logout = function() {
 AuthenticationService.logout(logoutSuccess);
 }
 })

4. 处理页面刷新的情况(可选)

如果用户刷新页面,之前存在内存里的用户信息会丢失,我们可以在应用启动时自动获取当前用户信息:

angular.module('app').run(function($rootScope, $http, AuthenticationService) {
    // 页面加载时尝试获取当前用户信息
    $http.get('/current-user')
        .then(function(res) {
            $rootScope.authenticated = true;
            $rootScope.currentUser = res.data;
            AuthenticationService.currentUser = res.data;
        })
        .catch(function() {
            // 如果获取失败,说明用户未登录
            $rootScope.authenticated = false;
        });
});

这样改造之后,用户登录成功就会自动跳转到对应的车辆页面,而且页面刷新后用户信息也能保留~

内容的提问来源于stack exchange,提问作者Piotron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:47:49