2013-09-13 3 views

ответ

129

Если вы хотите удалить объект после каждого ответа нет необходимости сессии

Если вы хотите сохранить объект во время сеанса пользователя, Он имеет несколько способов:

  1. непосредственно добавить один атрибут сессии:

    @RequestMapping(method = RequestMethod.GET) 
    public String testMestod(HttpServletRequest request){ 
        ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value); 
        return "testJsp"; 
    } 
    

    и вы можете получить его Фро контроллер, как это:

    ShoppingCart cart = (ShoppingCart)session.getAttribute("cart"); 
    
  2. Сделать контроллер сеанс области действия

    @Controller 
    @Scope("session") 
    
  3. Объем объекты, например, у вас есть пользовательский объект, который хочет быть в сессии каждый время:

    @Component 
    @Scope("session") 
    public class User 
    { 
        String user; 
        /* setter getter*/ 
        } 
    

    затем введите класс в каждый контроллер, который вы хотите

    @Autowired 
        private User user 
    

    который сохраняет класс на сессии.

  4. прокси инъекции АОП: весной -xml:

    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> 
    
        <bean id="user" class="com.User" scope="session">  
         <aop:scoped-proxy/> 
        </bean> 
    </beans> 
    

    затем впрыснуть класс в каждом контроллере, который вы хотите

    @Autowired 
    private User user 
    

5.Pass HttpSession методу:

String index(HttpSession session) { 
      session.setAttribute("mySessionAttribute", "someValue"); 
      return "index"; 
     } 

6.Сделать ModelAttribute в сессии По @SessionAttributes ("ShoppingCart"):

public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) { 
//Spring V4 
//you can modify session status by sessionStatus.setComplete(); 
} 

или вы можете добавить модель для всего класса контроллера Такой

@Controller 
    @SessionAttributes("ShoppingCart") 
    @RequestMapping("/req") 
    public class MYController { 

     @ModelAttribute("ShoppingCart") 
     public Visitor getShopCart (....) { 
      return new ShoppingCart(....); //get From DB Or Session 
     } 
     } 

каждый из них имеет преимущества и недостатки:

@session может использовать больше памяти в облачных системах, она копирует сеанс ко всем узлам, а прямой метод (1 и 5) имеет беспорядочный подход, нечестно тестировать единицы.

Чтобы получить доступ к сессии Jsp

<%=session.getAttribute("ShoppingCart.prop")%> 

в JSTL:

<c:out value="${sessionScope.ShoppingCart.prop}"/> 

в Thymeleaf:

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p> 
+5

3. Если ваш контроллер одноточечный, вам необходимо определить proxyMode = ScopedProxyMode.TARGET_CLASS для инъецируемого компонента с областью сеанса. @Scope (value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) –

+1

Сделать сеанс сеанса контроллера самым худшим вариантом здесь, хотя он выглядит простым и простым в использовании. Но если вы захотите увеличить время своего приложения в будущем, у вас возникнут проблемы, так как вам, вероятно, понадобится распределенное хранилище сеансов, такое как Redis (если вы не используете липкие сеансы, жертвуя доступностью для удобства). Таким образом, бобы с сессионным участком должны, как правило, быть немыми сериализуемыми POJO. Таким образом, вы готовы к масштабированию в случае возникновения необходимости. – chris

19

Ниже аннотированный код будет установлен «значение» на «имя»

@RequestMapping("/testing") 
@Controller 
public class TestController { 
@RequestMapping(method = RequestMethod.GET) 
public String testMestod(HttpServletRequest request){ 
    request.getSession().setAttribute("name", "value"); 
    return "testJsp"; 
    } 
} 

Чтобы получить доступ к тем же в JSP использовать ${sessionScope.name}.

Для @ModelAttribute увидеть это link

+0

Спасибо. ссылка '@ ModelAttribute' помогает мне :) – Eddy

35

Использование @SessionAttributes

Смотрите документацию: Using @SessionAttributes to store model attributes in the HTTP session between requests

«Understanding Spring MVC Model And Session Attributes» также дает очень хороший обзор сессий Spring MVC и объясняет, как/когда @ModelAttribute s передаются в сеанс (если контроллер @SessionAttributes аннотированный).

В этой статье также объясняется, что лучше использовать @SessionAttributes на модели вместо того, чтобы устанавливать атрибуты непосредственно на HttpSession, потому что это помогает Spring MVC быть агентом просмотра.

+0

Как вы можете использовать атрибуты sessionAttributes для передачи объектов между контроллерами? – larrytech

23

SessionAttribute аннотация - это самый простой и прямой, вместо того, чтобы получать сеанс от объекта запроса и атрибута установки. Любой объект может быть добавлен в модель контроллера, и он будет сохранен в сеансе, если его имя совпадает с аргументом в аннотации @SessionAttributes. Ниже, например, personObj будет доступен в сеансе.

@Controller 
@SessionAttributes("personObj") 
public class PersonController { 

    @RequestMapping(value="/person-form") 
    public ModelAndView personPage() { 
     return new ModelAndView("person-page", "person-entity", new Person()); 
    } 

    @RequestMapping(value="/process-person") 
    public ModelAndView processPerson(@ModelAttribute Person person) { 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("person-result-page"); 

     modelAndView.addObject("pers", person); 
     modelAndView.addObject("personObj", person); 

     return modelAndView; 
    } 

} 
+0

сеансы работают только для запросов внутри одного экземпляра контроллера. Что делать, если управление нужно отправить другому контроллеру, этот сеанс будет уничтожен, и при необходимости будет создан новый. – larrytech

+1

@larrytech как это могло быть? Я думаю, вы только что забыли добавить SessionAttributes ко второму контроллеру – Yura

1

Когда я пытаюсь подключиться к модему (который является загрузочным модальным), я использовал аннотацию @sessionattributes. Но проблема заключалась в том, что представление является перенаправлением («redirect:/home»), значения, введенные мной на сеанс, отображаются в URL-адресе. Некоторые интернет-источники предлагают следовать http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting Но вместо этого я использовал HttpSession. Этот сеанс будет находиться до закрытия браузеров. Вот пример кода

 @RequestMapping(value = "/login") 
     @ResponseBody 
     public BooleanResponse login(HttpSession session,HttpServletRequest request){ 
      //HttpServletRequest used to take data to the controller 
      String username = request.getParameter("username"); 
      String password = request.getParameter("password"); 

      //Here you set your values to the session 
      session.setAttribute("username", username); 
      session.setAttribute("email", email); 

      //your code goes here 
} 

не меняют конкретную вещь на вид сбоку.

<c:out value="${username}"></c:out> 
<c:out value="${email}"></c:out> 

После того, как вы зашли на сайт, добавьте выше коды в любое место на вашем веб-сайте. Если сеанс правильно установлен, вы увидите значения там. Убедитесь, что вы правильно добавили JSTL-тег и Эль- выражение (Вот ссылка для установки JSTL тегов https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly/)

1

не является самым легким и кратчайшего таким образом?Я знал это и просто проверял его: здесь работает отлично:

@GetMapping 
public String hello(HttpSession session) { 
    session.setAttribute("name","value"); 
    return "hello"; 
} 

p.s. Я пришел сюда, чтобы найти ответ «Как использовать атрибуты сеанса в Spring-mvc», но читайте так много, не видя наиболее очевидного, что я написал в своем коде. Я этого не видел, поэтому я подумал, что это неправильно, но это не так. Поэтому давайте поделиться этими знаниями с самым простым решением для основного вопроса.

+0

Этот код вы можете найти в вопросе – gstackoverflow

1

Попробуйте это ...

@Controller 
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit") 
@SessionAttributes("pet") 
public class EditPetForm { 

    @ModelAttribute("types") 

    public Collection<PetType> populatePetTypes() { 
     return this.clinic.getPetTypes(); 
    } 

    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(@ModelAttribute("pet") Pet pet, 
      BindingResult result, SessionStatus status) { 
     new PetValidator().validate(pet, result); 
     if (result.hasErrors()) { 
      return "petForm"; 
     }else { 
      this.clinic.storePet(pet); 
      status.setComplete(); 
      return "redirect:owner.do?ownerId=" 
       + pet.getOwner().getId(); 
     } 
    } 
} 
0

Использовать этот метод очень простой простой в использовании

HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest(); 

                  request.getSession().setAttribute("errorMsg", "your massage"); 

в JSP один раз использовать затем удалить

<c:remove var="errorMsg" scope="session"/>  
0

Весной 4 Web MVC , Вы можете использовать @SessionAttribute в методе с @SessionAttributes в Контроллер уровне

@Controller 
@SessionAttributes("SessionKey") 
public class OrderController extends BaseController { 

    GetMapping("/showOrder") 
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) { 
    // method body 
} 
Смежные вопросы