JAVA

@SessionAttributes

Strickland 2024. 5. 5. 11:09

스프링 부트에서 각 브라우저마다 세션 ID를 확인하는 것은 일반적으로 HTTP 세션을 통해 이루어진다.

브라우저가 서버에 요청을 보낼 때마다 서버는 각 요청에 대해 세션 ID를 생성하거나 사용한다.

세션 ID는 브라우저와 서버 간의 연결을 유지하고 해당 세션에 저장된 데이터에 접근하는 데 사용된다.

 

@SessionAttributes

특정 브라우저의 세션에 값을 저장하고 사용하고 싶을땐 어떻게 할까 ? 

@SessionAttributes 를 사용하면 된다.

 

이 어노테이션은 클래스레벨 어노테이션이다 

아래의 코드를 보자

package com.hyukjin.springboot.myfirstwebapp.login;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

@Controller
@SessionAttributes("name")
public class LoginController {
    private AuthenticationService authenticationService;

    public LoginController(AuthenticationService authenticationService) {
        this.authenticationService = authenticationService;
    }

    @GetMapping("login")
    // src/main/resources/META-INF/resources/WEB-INF/jsp/sayHello.jsp
    public String gotoLoginPate() {

        return "login";
    }

    @PostMapping("login")
    public String gotoWelcomePage(@RequestParam String name,
                                  @RequestParam String password,
                                  ModelMap model) {

        if (authenticationService.authenticate(name, password)) {
            model.put("name", name);
            //model.put("password", password);
            //name -> hyukjin
            // password -> 981222
            return "welcome";
        }

        model.put("errorMessage", "Invalide Credentials! Please try again.");
        return "login";

    }

}

위의 LoginController 에선 name 을 세션에 저장하길 원한다.

gotoWelcomePage 핸들러에서 model.put("name", name) 에서 저장된 name 은 세션레벨에 저장이 된다.

 

세션 속성을 공유하기 원하는 컨트롤러 마다 @SessionAttributes를 적용해주자

package com.hyukjin.springboot.myfirstwebapp.todo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

import java.util.List;

@Controller
@SessionAttributes("name")
public class TodoController {

    private TodoService todoService;

    public TodoController(TodoService todoService) {
        this.todoService = todoService;
    }

    @RequestMapping("list-todos")
    public String listAllTodos(ModelMap model) {
        List<Todo> todos = todoService.findByUsername("hello");
        model.put("todos", todos);
        System.out.println(model.values());
        return "listTodos";
    }
}

@SessionAttributes("name") 어노테이션을 추가 함으로서 이 컨트롤러에선 세션의 name 속성에 접근이 가능하다

이 name 속성은 명시하지 않아도 자동으로 model에 담겨있으며 JSP 가 뷰를 렌더링 할때 읽을 수 있다.

 

listTodos.jsp

<html>
<head>
    <title>List Todos Page</title>
</head>
<body>
<div>Welcome to your page</div>
<div>your name is ${name}</div>
<div>Your Todos are ${todos}</div>
<%--       <div>Your Password: ${password}</div>--%>
</body>
</html>

 

'JAVA' 카테고리의 다른 글

webjars 를 이용한 bootstrap, jquery 추가 방법 / MAVEN  (0) 2024.05.06
JSTL 사용법/ MAVEN  (0) 2024.05.05
JSP 서빙/ MAVEN  (0) 2024.05.04
JDBC / Maven  (0) 2024.05.04
@ConfigurationProperties  (0) 2024.05.03