본문으로 바로가기

[Spring MVC] @SessionAttribute

category Spring/SpringMVC 2019. 8. 19. 20:33

@SessionAttribute

: @SessionAttributes와 다르다.

  - @SessionAttributes는 해당 컨트롤러 내에서만 동작

     => 해당 컨트롤러 안에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용

  - @SessionAttribute는 컨트롤러 밖(인터셉터 또는 필터 등)에서 만들어 준 세션 데이터에 접근할 때 사용한다.

: HttpSession을 사용할 때 비해 타입 컨버전을 자동으로 지원하기 때문에 조금 편리함

: HTTP 세션에 데이터를 넣고 빼고 싶은 경우에는 HttpSession을 사용할 것

 

package com.example.demo;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.SessionAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

@Controller
public class SampleController {
	
	@GetMapping("/events/form/name")
	public String eventFormName(Model model) {
		model.addAttribute("event",new Event());
		return "/events/form-name";
	}

	@PostMapping("/events/form/name")
	public String eventsFromNameSubmit(@Validated @ModelAttribute Event event
			,BindingResult bindingResult) {
		if(bindingResult.hasErrors()) {
			return "/events/form-name";
		}
		
		return "redirect:/events/form/limit";
	}
	
		@GetMapping("/events/form/limit")
	public String eventFormLimit(@ModelAttribute Event event , Model model) {
		model.addAttribute("event",event);
		return "/events/form-limit";
	}

	@PostMapping("/events/form/limit")
	public String createEvent(@Validated @ModelAttribute Event event
			,BindingResult bindingResult
			,SessionStatus sessionStatus) {
		if(bindingResult.hasErrors()) {
			return "/events/form-limit";
		}
		sessionStatus.setComplete();
		return "redirect:/events/list";
	}
	
	
	@GetMapping("/events/list")
	public String getEvents(Model model , @SessionAttribute LocalDateTime visitTime, HttpSession httpSession) {
		System.out.println("visitTime : " + visitTime);
		System.out.println("httpSession : " + (LocalDateTime)httpSession.getAttribute("visitTime"));
		Event event = new Event();
		event.setName("spring");
		event.setLimit(10);
		
		
		List<Event> eventList = new ArrayList<Event>();
		eventList.add(event);
		model.addAttribute(eventList);
		
		return "/events/list";
	}
	
}

 

package com.example.demo;

import java.time.LocalDateTime;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;

public class VisitTimeInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		HttpSession session =  request.getSession();
		if(session.getAttribute("visitTime") ==null) {
			session.setAttribute("visitTime", LocalDateTime.now());
		}
		
		return true;
	}

}

 

인터셉터에서 session을 넣어주고 @SessionAttribute 어노테이션을 이용해서 Session을 가져온다.

자동 컨버전이 가능하기 때문에 굉장히 편리하다.

또한 HttpSession으로도 가져올수 있으나 타입 컨버전을 해야하기 때문에 번거롭다.

 

package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;

@Configuration
public class WebConfig implements WebMvcConfigurer{

	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
		UrlPathHelper urlPathHelper = new UrlPathHelper();
		urlPathHelper.setRemoveSemicolonContent(false);
		configurer.setUrlPathHelper(urlPathHelper);
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new VisitTimeInterceptor());
	}
	
}

 

'Spring > SpringMVC' 카테고리의 다른 글

[Spring MVC] Flash Attributes  (0) 2019.08.20
[Spring MVC] RedirectAttributes  (0) 2019.08.19
[Spring MVC] @SessionAttributes  (0) 2019.08.15
[Spring MVC] @Valid vs @Validated  (1) 2019.08.13
[Spring MVC] @ModelAttribute  (0) 2019.08.13