会话作用域bean的spring设置程序在restcontroller中不工作

7cjasjjr  于 2021-07-13  发布在  Java
关注(0)|答案(0)|浏览(244)

我试图在用户使用登录后从会话范围的bean中获取用户名 /users/login 我已经 Autowired 会话作用域bean到 RestController 在rest控制器的一个端点中,我调用了会话范围bean上的setter。但是对于来自同一会话的请求,setter的效果是不可见的。
以下是我的会话范围bean:

import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

@Getter
@Setter
public class SessionSpecificUserDetails implements Serializable {

    private String userName;

}
import lombok.Getter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.annotation.SessionScope;

@Getter
@Configuration
public class UserSessionDetailsConfiguration {

    @Bean
    @SessionScope
    public SessionSpecificUserDetails sessionSpecificUserDetails() {
        return new SessionSpecificUserDetails();
    }

}

以下是 RestController ```
import com.course.backend.coursebackend.config.SessionSpecificUserDetails;
import com.course.backend.coursebackend.dao.User;
import com.course.backend.coursebackend.repository.UserRepository;
import com.course.backend.coursebackend.utils.ResponseUtils;
import com.course.backend.coursebackend.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/users")
public class UserController {

@Autowired
UserRepository userRepository;

@Autowired
SessionSpecificUserDetails sessionSpecificUserDetails;

@GetMapping("/getLoggedInUser")
public String getLoggedInUser() {
    return sessionSpecificUserDetails.getUserName();
}

@PostMapping("/login")
public ResponseUtils.CustomResponse login(@RequestBody User user) {
    List<User> users = getAllUsers();
    Optional<User> optionalUser = users.stream()
            .filter(currentUser -> currentUser.getUserName().equals(user.getUserName()))
            .findAny();
    if (optionalUser.isEmpty()) {
        return ResponseUtils.getErrorResponse(List.of("Username not found!"));
    }
    if (optionalUser.get().getPassword().equals(user.getPassword())) {
        sessionSpecificUserDetails.setUserName(user.getUserName());
        return ResponseUtils.getSuccessResponse("Login Successful!");
    }
    return ResponseUtils.getErrorResponse(List.of("Login failed due to wrong password!"));
}

}

我看到spring正在为会话范围的bean创建代理(可能是因为我的二传手即使在同一节课上也没有任何效果?)
我的问题是,在会话中使用会话作用域bean的正确方法是什么 `RestController` ? 在请求之间获取同一会话的用户名的好方法是什么?我试过做记号 `UserController` 也作为 `@SessionScope` 但这也不管用。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题