【问题标题】:Spring MVC&Freemarker - new session every request?Spring MVC&Freemarker - 每个请求的新会话?
【发布时间】:2013-07-21 09:11:52
【问题描述】:

我基于 Spring MVC 3 中的会话创建了带有注册和登录的简单 Web 应用程序,当我使用 JSTL 显示值时,它完全可以工作。 然后,我添加了 Freemarker,但出了点问题。每个请求都会创建一个新的 UserSession 对象,所以我无法存储信息。

一些代码:

调度程序-servlet.xml:

<context:component-scan base-package="com.revicostudio.web" />
<mvc:annotation-driven />

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
    <property name="freemarkerVariables">
      <map>
        <entry key="xml_escape" value-ref="fmXmlEscape"/>
      </map>
    </property>
</bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="true"/>
    <property name="prefix" value=""/>
    <property name="suffix" value=".jsp"/>
    <property name="exposeSpringMacroHelpers" value="true"/>
    <property name="exposeRequestAttributes" value="true"/>
    <property name="exposeSessionAttributes" value="true"/>
    <property name="exposePathVariables" value="true"/>
</bean>

<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>

索引控制器:

@Controller
@RequestMapping("/index")
public class IndexController {

    @RequestMapping(method=RequestMethod.GET)
    public String getIndex(Model model, UserSession userSession) {
        model.addAttribute("userSession", userSession);
        return "index";
    }

    @ModelAttribute("userRegisterCredentials")
    public UserRegisterCredentials getUserRegisterCredentials() {
        return new UserRegisterCredentials();
    }

    @ModelAttribute("userLoginCredentials")
    public UserLoginCredentials getUserLoginCredentials() {
        return new UserLoginCredentials();
    }
}

登录控制器:

@Controller
@RequestMapping("/login")
public class LoginController {

    @Autowired
    private UsersDatabaseService usersDatabaseService;

    @RequestMapping(method = RequestMethod.POST)
    public String login(
            @ModelAttribute UserLoginCredentials userLoginCredentials,
            UserSession userSession,
            final RedirectAttributes redirectAttributes)
    {
        int failedLoginAttempts = userSession.getFailedLoginAttempts();

        if (failedLoginAttempts < LoginConfig.maxLoginTries ||
                System.currentTimeMillis()-userSession.getFailedLoginsWaitTimeStart() > LoginConfig.failedLoginsWaitMinutes*60*1000) {

            if (usersDatabaseService.isValidPassword(userLoginCredentials.getUsername(), userLoginCredentials.getPassword())) {
                userSession.setUser(usersDatabaseService.getUser(userLoginCredentials.getUsername()));    
                userSession.setFailedLoginsWaitTimeStart(System.currentTimeMillis());
            }
            else {
                failedLoginAttempts++;

                if (failedLoginAttempts == LoginConfig.maxLoginTries) {
                    redirectAttributes.addFlashAttribute("error", 
                            "You've entered invalid username or password more than "
                            + LoginConfig.maxLoginTries + " times. Try again in "
                            + LoginConfig.failedLoginsWaitMinutes +" minutes.");
                }
                else { 
                    redirectAttributes.addFlashAttribute("error", "Invalid username or password");
                    userSession.setFailedLoginAttempts(failedLoginAttempts);
                    System.out.println(failedLoginAttempts);
                }
            }
        }
        else {
            redirectAttributes.addFlashAttribute("error", 
                    "You've entered invalid username or password more than "
                    + LoginConfig.maxLoginTries + " times. Try again in "
                    + LoginConfig.failedLoginsWaitMinutes +" minutes."); 
        }

        return "redirect:/";
    }
}

UserSession.java:

@Scope("session")
@Data
@AllArgsConstructor
@NoArgsConstructor 
public class UserSession {
    private User user;

    private int failedLoginAttempts;
    private long failedLoginsWaitTimeStart;
    private long created = System.currentTimeMillis();
}

【问题讨论】:

    标签: java spring session attributes freemarker


    【解决方案1】:

    通过从 getIndex() 方法中删除“UserSession userSession”参数解决了该问题。不知道为什么它会导致问题..

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2016-01-18
      • 2017-09-17
      • 2019-01-16
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多