How to Get Session Object In Spring MVC

Posted on the 14 August 2013 by Abhishek Somani @somaniabhi
Getting HttpSession Object in Spring Controller is very easy . Just Put it as a method parameter in controller method and Spring will automatically inject it .
@RequestMapping(value = "/test", method = RequestMethod.POST)
 @ResponseBody
 public JsonResponse getSessionIncontroller
         (@RequestBody String jsonReqString ,HttpSession session) 
{

  session.setAttribute("success" , "successfully accessed");
  return jsonResponse;
 }
Access the session variable in jsp using EL like this :
<%@ page isELIgnored="false"%>
<c:if test="${not empty success}">
   <div id="success" class="success">
    <c:out value="${success}"></c:out>
   </div>
</c:if>


Or , you can inject HttpServletRequest Object in controller method and get the session object from it
@RequestMapping(value = "/test", method = RequestMethod.POST)
 @ResponseBody
 public JsonResponse getSessionIncontroller
         (@RequestBody String jsonReqString ,HttpSession session) 
{

  session.setAttribute("success" , "successfully accessed");
  return jsonResponse;
 }
There is another approach where we create Session scoped Controller . This Controller get created for each session and controller object is stored in session.
@Controller
@Scope("session")
public class SessionScopedController
{
   private Cart cart = new Cart();
 
   @RequestMapping("/addToCart")
   public String addToCart(@RequestParam("id") int id)
   {
      
   }
}

Or , you can create a session scoped component and inject this in your controller like this :
@Component
@Scope("session")
public class Cart
{
   // simple POJO fields
}
@Controller
@Scope("request")
public class SessionController
{
   @Autowired
   private Cart cart;
 
   @RequestMapping("/addToCart")
   public String addToCart(@RequestParam("id") int id)
   {
      // 
   } 
}
Please note that the scope of controller is request , so for every request a new controller is created and session variable cart is injected in this . Another method is to use Scoped Proxy like this :
@Component
@Scope("session",proxyMode=ScopedProxyMode.INTERFACES)
public class Cart
{
   // simple POJO fields
}
@Controller
public class SessionController
{
   @Autowired
   private Cart cart;
 
   @RequestMapping("/addToCart")
   public String addToCart(@RequestParam("id") int id)
   {
      // 
   } 
}
Now the controller need not be request scope. So the overhead of creating a controller for each request is removed , and we don't have to add HttpSession in each controller method either . The Scoped Proxy make sure to get the session each time it is accessed . Reference Post Comments And Suggestions !!