java - Spring Boot中如何记住用户?

标签 java spring-boot spring-mvc authentication session

抱歉,如果这是显而易见的事情,但我在编程方面非常陌生。我的应用程序能够登录/注册用户,但是一旦我导航到应用程序中的不同页面,然后返回到用户页面,它就像我尚未登录一样。我不确定如何让它记住我已经登录。我假设我需要将 session 数据从我的用户 Controller 传递到我的其他 Controller 类。但老实说我只是迷路了。任何帮助将不胜感激。

我的验证码

public static final String userSessionKey = "user";


public User getUserFromSession(HttpSession session) {
    Integer userId = (Integer) session.getAttribute(userSessionKey);
    if (userId == null) {
        return null;
    }

    Optional<User> user = userDao.findById(userId);

    if (user.isEmpty()) {
        return null;
    }

    return user.get();
}

public static void setUserInSession(HttpSession session, User user) {
    session.setAttribute(userSessionKey, user.getId());
}

我的登录代码(登录后的事件,如果我再次点击登录选项卡,它会将我带到登录路线而不是用户帐户路线。)

@RequestMapping(value = "login", method = RequestMethod.GET)
public String displayLogin(HttpServletRequest session, Model model){

    if (session.getAttribute(userSessionKey) == null){
        model.addAttribute("title", "Login");
        model.addAttribute("users", userDao.findAll());
        return "user/login";
    }

    return "user/account";
}

@RequestMapping(value = "login", method = RequestMethod.POST)
public String processLogin(@RequestParam(name = "password") String password,
                           @RequestParam(name = "email")String email,
                           Model model){
    for(User theUser: userDao.findAll()){
        if(theUser.getEmail().equals(email) && theUser.getPassword().equals(password)) {
            model.addAttribute("userAccount", theUser);
            return "user/account";
        }else{
            model.addAttribute("invalidCredentials", true);
        }
    }

    return "user/account";
}

我如何在其他类(class)中尝试测试它的示例(真的不确定我的方法是否接近)

@OneToOne
public UserController userController;

@Autowired
private PaoDao paoDao;

@Autowired
private UserDao userDao;

@RequestMapping(value = "remove", method = RequestMethod.GET)
public String displayRemovePaoForm(HttpSession session, Model model) {

    if (userController.getUserFromSession() == null){
        model.addAttribute("title", "Login");
        model.addAttribute("users", userDao.findAll());
        return "redirect:login";
    }

    model.addAttribute("paos", paoDao.findAll());
    model.addAttribute("title", "Remove Pao");
    return "pao/remove";
}

我想要的只是登录并保持登录状态直到注销,我不知道该怎么做。感谢您的帮助。

最佳答案

您必须使用存储类型来存储用户的 session 。 您可以使用两种存储类型:jdbc 和 redis

对于 JDBC 使用:application.properties 文件中的 spring.session.store-type=jdbc 属性。

添加 JDBC 依赖项:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>

对于redis使用:application.properties文件中的spring.session.store-type=redis属性。

添加redis依赖:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

这可能会有所帮助..!!

关于java - Spring Boot中如何记住用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61625580/

相关文章:

unit-testing - @ModelAttribute Controller spring-mvc 模拟

java - 如何在jfree中从log 10切换到log 2

java - 从 ArrayList 中删除对象时应用程序崩溃

java - 项目 Reactor 中的 Parallel Flux 与 Flux

H2 数据库控制台 spring boot 加载被 X-Frame-Options 拒绝

java - 如何在 spring-boot 中强制 Jackson2ObjectMapperBuilder?

java - 未释放 Tomcat JDBC 连接资源

java - 基于 CMS 的应用程序的一般架构

java.lang.NoClassDefFoundError : Could not initialize class org. springframework.web.servlet.tags.form.FormTag

spring - 在 Spring 中拆分应用程序上下文文件