在SpringMVC 3.1中的应用程序,Grinder运行显示“预期的会话属性xxxxxx”错误

时间:2014-03-04 15:17:58

标签: java session spring-mvc

首先,我要感谢您审阅此问题,并提供任何帮助 - 我非常感谢!

我在Openshift环境中开发了Spring MVC框架(3.1.1)中的应用程序。我已经测试并对其功能感到满意。

当我在Grinder上加载appl进行性能测试时,我收到了以下消息,其中很多都是:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/].[MVCDispatcher]] (http-/127.8.157.1:8080-5) JBWEB000236: Servlet.service() for servlet MVCDispatcher threw exception: org.springframework.web.HttpSessionRequiredException: Expected session attribute 'session_account'

在我的appl中,session_account是3个类中的会话属性(由@SessionAttribute({...})定义)。它也被定义为@ModelAttribute。

这三个类中的一个是LoginController.java,它通过@ModelAttribute(“session_account”)注释的方法初始化session_account。它还包含对用户进行身份验证的REST服务,并在身份验证后将值设置为session_account。我的功能测试(似乎)确认每个经过身份验证的用户都定义了session_account。

现在进行Grinder的性能测试。以下是一些观察结果:

  1. 大多数测试脚本都会产生大量上述错误消息;

  2. 当我将Grinder运行限制为使用单个(java)线程的一个用户时,没有错误。只要我将环境放宽到多个用户或多个(java)线程,就会出现此错误消息;

  3. 错误消息似乎来自Spring层。我很难将它映射到我的应用程序代码(行)

  4. 在我的应用程序日志中,此错误(行)经常出现在具有较晚时间戳的行之后,例如:

    2014/03/03 13:44:22,930 INFO  [org.SandRiver.Controllers.JspController] (http-127.8.157.1/127.8.157.1:8080-32) home page
    2014/03/03 13:44:22,822 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/].[MVCDispatcher]] (http-127.8.157.1/127.8.157.1:8080-54) JBWEB000236: Servlet.service() for servlet MVCDispatcher threw exception: org.springframework.web.HttpSessionRequiredException: Expected session attribute 'session_account'
    
  5. 我用Google搜索了“预期的会话属性”,并参考了Spring文档中的相关章节。不幸的是,我仍在这里寻求帮助。

    我已经迷失了,我甚至不知道哪个文件/代码片段与此问题相关。这是web.mxl,但如果被问到,我们很乐意提供更多信息。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">
      <display-name>LiquibilClient</display-name>
    
      <servlet>
        <servlet-name>MVCDispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>MVCDispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
      <context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/MVCDispatcher-servlet.xml,
                     /WEB-INF/applicationContext.xml,               
                     /WEB-INF/application-security.xml              
         </param-value>
      </context-param>
    
      <listener>
         <listener-class>
            org.springframework.web.context.ContextLoaderListener
         </listener-class>
      </listener>
    
      <listener>
         <listener-class>
          org.springframework.security.web.session.HttpSessionEventPublisher
         </listener-class>
      </listener> 
    
      <filter>
         <filter-name>Set Character Encoding</filter-name>
         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
         <init-param>
           <param-name>encoding</param-name>
           <param-value>UTF-8</param-value>
         </init-param>
         <init-param>
           <param-name>forceEncoding</param-name>
           <param-value>true</param-value>
         </init-param>
       </filter>
    
       <filter-mapping>
         <filter-name>Set Character Encoding</filter-name>
         <url-pattern>*.do</url-pattern>
       </filter-mapping>
    
       <!-- Spring Security  -->
         <filter>
             <filter-name>springSecurityFilterChain</filter-name>
             <filter-class>
                       org.springframework.web.filter.DelegatingFilterProxy
                     </filter-class>
         </filter>
    
         <filter-mapping>
             <filter-name>springSecurityFilterChain</filter-name>
             <url-pattern>/*</url-pattern>
         </filter-mapping>  
     </web-app>
    

1 个答案:

答案 0 :(得分:0)

我认为问题可能是由于Grinder在用更多请求命中服务器之前没有等待身份验证请求返回。会话已存在,但它还没有session_account,因此您的错误会累积,直到返回身份验证响应。

您可以添加过滤器以防止http请求在身份验证调用期间进入,或者您可以将Grinder脚本更改为等到第一个响应返回后再让其他请求飞起来。