会话变量未在Spring中设置

时间:2010-10-20 06:27:36

标签: java spring-mvc session-variables

我有一个Spring控制器,它在会话中放置一个变量:

public class LoginFormController extends SimpleFormController {

    public ModelAndView onSubmit(HttpServletRequest request, 
            HttpServletResponse response, Object command) throws Exception {

            request.getSession().setAttribute("authenticated_user", "authenticated_user");
    }
}

然后我有一个HandlerInterceptor。在preHandle方法中,我检查会话中的变量:

public boolean preHandle(HttpServletRequest request,
                                      HttpServletResponse response,
                                      Object handler) throws Exception {

        /* first, check if the requested view even required authentication */
        if (isAuthenticationRequired(request)) {

            /* check to see that user is logged in */
            if (null == request.getSession().getAttribute("authenticated_user")) {
                forwardToLogonPage(request, response);
                return false;
            }
            /* all is ok - pass the request on */
            return true;
        }
        /* all is ok - pass the request on */
        return true;
    }

问题是似乎没有设置会话变量,因为request.getSession()。getAttribute(“authenticated_user”))总是解析为null。

有什么想法吗?

谢谢, Krt_Malta

2 个答案:

答案 0 :(得分:0)

尝试使用throw new ModelAndViewDefiningException(new ModelAndView("logonPage"))代替return false

在您的logonPage中,明确地在表单标记中包含操作,如下所示:

<form:form method="post" commandName="login" action="logonPage.htm">

答案 1 :(得分:0)

您还可以注入ServletRequestAttributes。 包括:

import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

我是在一个抽象的超级控制器中完成的,所以我的所有控制器都可以识别servlet请求。

要提取您使用的Request对象,可以使用以下

protected ServletRequestAttributes getServletRequest(){
    return (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
  }