【问题标题】:Spring MVC - @Scope("session") doesn't work like intendedSpring MVC - @Scope("session") 不像预期的那样工作
【发布时间】:2015-05-15 01:36:36
【问题描述】:

我正在尝试使用 Spring MVC 开发简单的抽认卡应用程序。 一切都很顺利,直到我尝试与多个用户一起测试它。 我希望每个用户都登录并假设 @Session("scope") 将为每个用户重新创建每个 bean。在我看来,这不起作用 - 我在 3 个不同的设备上登录并且它们都已连接,当我在一台计算机上登录时,第二台和第三台计算机上的登录相同。当我注销时 - 所有计算机都已注销。

我很困惑 - 请帮助:

   @Controller
@Scope("session")
@SessionAttributes({"logged", "LoggedUser"})


@RequestMapping("/")
public class IndexController {


 public   static NewUser loggedUser;

    @Autowired
    private NewUserRepository newUserRepository;

    @Autowired
    private FlashcardRepository flashcardRepository;



(.....)

也许它与这个静态变量有关——我希望它对每个浏览器会话都是分开的。

【问题讨论】:

  • 您知道static 对字段的含义吗?您的@SessionAttributesLoggerUser 与类字段loggedUser 之间没有关系。

标签: java session spring-mvc


【解决方案1】:

好的 - 我知道出了什么问题...每次创建新 bean(具有会话范围)时,静态字段都保持不变。我应该将登录数据存储在非静态变量中...抱歉混淆,谢谢!

【讨论】:

    【解决方案2】:

    (...)

     if (loggedUser!=null){
            model.addAttribute("LoggedUser", loggedUser.getName());}
    
            if (loggedUser==null){
                model.addAttribute("LoggedUser", "not logged");}
            return "index";
        }
    

    (...)

          @RequestMapping(value = "/logUser", method = RequestMethod.POST)
        public String logUser(@ModelAttribute NewUser newUser, BindingResult result, ModelMap model) {
    
    
            if (!newUserRepository.findByName(newUser.getName()).isEmpty()) {
    
              loggedUser=newUserRepository.findByName(newUser.getName()).get(0);
                DrillController.queueKeys=null;
    DrillController.cards.clear();
    DrillController.wrongAnswers=null;
               if (loggedUser.getNumberOfRepsSetting()!=null) {
                   DrillController.NumberOfReps = Integer.parseInt(loggedUser.getNumberOfRepsSetting());
               }
            }
    
    
    
        return "redirect:/";
    }
    

    也许这有什么问题?我不确定这个静态字段是否在每个会话中都重新创建?

    对于所有的混乱,我很抱歉——我只是希望这个静态字段在每个新的浏览器会话中都为空。我了解静态在普通 java 中的工作原理,但我对它在 Spring 上下文中如何使用 bean 和多个用户感到困惑。我在这里想对了吗?

    【讨论】:

      【解决方案3】:

      @Scope 注释用于使整个 bean 会话了解其所有属性。 @SessionAttributes 使您的 model 对象会话感知,您需要手动填充和管理它(例如 init)。

      正如@Sotirios Delimanolis 所写,您应该了解静态和非静态属性之间的区别。

      如果我是正确的,你正在寻找这样的东西:

      @Controller
      @SessionAttributes({IndexController.LOGGED_USER_MODEL })
      @RequestMapping("/")
      public class IndexController {
      
          private static final String LOGGED_USER_MODEL = "loggedUser";
          public NewUser loggedUser;
      
          @Autowired
          private NewUserRepository newUserRepository;
      
          @Autowired
          private FlashcardRepository flashcardRepository;
      
          @ModelAttribute(LOGGED_USER_MODEL)
          public NewUser initLoggedUser() {
              //this is to make sure that our session attribute model is always populated, otherwise Spring throws exception
              return new NewUser();
          }
      
          @RequestMapping
          public Model someMethod(@ModelAttribute(LOGGED_USER_MODEL) NewUser loggedUser) {
              //do something with logged user, populete with repository for example
          }  
      

      【讨论】:

        猜你喜欢
        • 2014-05-16
        • 1970-01-01
        • 2012-06-13
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 2016-03-07
        相关资源
        最近更新 更多