Как использовать атрибуты сеанса в Spring-mvc



не могли бы вы помочь мне написать аналог стиля spring mvc этого кода?



 session.setAttribute("name","value");


и как добавить элемент, который аннотирован @ModelAttribute аннотация к сессии, а затем получить доступ к нему?

1196   9  

9 ответов:

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

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

  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. AOP прокси инъекции : весной-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.Передайте 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}"/>

in Thymeleaf:

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

использовать @SessionAttributes

посмотреть документы: использование @ SessionAttributes для хранения атрибутов модели в сеансе HTTP между запросами

"Понимание модели Spring MVC и атрибутов сеанса " также дает очень хороший обзор весенних сессий MVC и объясняет, как / когда @ModelAttribute s переносятся в сеанс (если контроллер @SessionAttributes аннотированный).

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

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;
    }

}

ниже аннотированный код будет установить "значение "в"имя"

@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 посмотреть этот ссылке

Не проще ли и короткий в ту сторону? Я знал это и просто проверил его-работает отлично здесь:

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

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

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

@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();
        }
    }
}

когда я пытаюсь войти в систему (которая является модальной загрузкой), я использовал аннотацию @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 и El-выражения (вот ссылка для установки тегов jstlhttps://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project-correctly/)

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

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

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

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

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

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

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

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}

Comments

    Ничего не найдено.