首先,我要感谢您审阅此问题,并提供任何帮助 - 我非常感谢!
我在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的性能测试。以下是一些观察结果:
大多数测试脚本都会产生大量上述错误消息;
当我将Grinder运行限制为使用单个(java)线程的一个用户时,没有错误。只要我将环境放宽到多个用户或多个(java)线程,就会出现此错误消息;
错误消息似乎来自Spring层。我很难将它映射到我的应用程序代码(行)
在我的应用程序日志中,此错误(行)经常出现在具有较晚时间戳的行之后,例如:
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'
我用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>
答案 0 :(得分:0)
我认为问题可能是由于Grinder在用更多请求命中服务器之前没有等待身份验证请求返回。会话已存在,但它还没有session_account,因此您的错误会累积,直到返回身份验证响应。
您可以添加过滤器以防止http请求在身份验证调用期间进入,或者您可以将Grinder脚本更改为等到第一个响应返回后再让其他请求飞起来。