Java JSTL fmt库抛出500错误,是否需要启用会话?
我正在Google App Engine上开发一个简单的servlet/JSP数据驱动网站。我已经开始在一些数据输入表单上使用JSTL fmt库,并且在使用标记Java JSTL fmt库抛出500错误,是否需要启用会话?,java,google-app-engine,jsp,jstl,Java,Google App Engine,Jsp,Jstl,我正在Google App Engine上开发一个简单的servlet/JSP数据驱动网站。我已经开始在一些数据输入表单上使用JSTL fmt库,并且在使用标记和: [java]java.lang.RuntimeException:appengine-web.xml中未启用会话支持。要启用会话,请在该文件中设置true。没有它,getSession()是允许的,但是sessionattributes的操作是不允许的 例如,我的JSP中的代码是: <c:forEach var="item"
和:
[java]java.lang.RuntimeException:appengine-web.xml中未启用会话支持。要启用会话,请在该文件中设置true。没有它,getSession()是允许的,但是sessionattributes的操作是不允许的
例如,我的JSP中的代码是:
<c:forEach var="item" items="${dayList}" >
<option><fmt:formatNumber value="${item}" pattern="00"/></option>
</c:forEach>
或
现在:${Now}
年份:
当我注释掉这些行时,页面会在重新打开时呈现错误结果
我没有启用会话,因为我不需要这个web应用程序使用它们,并且读到如果不需要,最好不要启用。我已经确认没有任何属性是会话范围的,我的NetBeans项目中唯一出现的“会话”是在web.xml中:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
30
一旦我在appengine-web.xml上启用会话,一切都会正常工作
我的研究指出了您可以在web.xml中设置的一些与区域设置相关的上下文参数,即:
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
<param-value>en-US</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>en-US</param-value>
</context-param>
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.timeZone</param-name>
<param-value>EDT</param-value>
</context-param>
javax.servlet.jsp.jstl.fmt.fallbackLocale
恩美
javax.servlet.jsp.jstl.fmt.locale
恩美
javax.servlet.jsp.jstl.fmt.timeZone
乙二胺四乙酸
我在设置了这些参数的情况下重新部署(并且关闭了会话),得到了相同的错误
JSTL fmt库似乎可以非常方便地在web表单上使用日期和数字等,尽管在一天结束时,我可能只需要启用会话并继续前进——但我是否遗漏了一些导致会话在默认情况下被引用的语言环境设置?这可能是应用程序引擎特有的吗
谢谢
附言。
这是我在禁用会话时得到的堆栈跟踪:
[java] Aug 17, 2010 2:41:26 AM com.google.apphosting.utils.jetty.JettyLogger warn
[java] WARNING: /manage/events/new
[java] java.lang.RuntimeException: Session support is not enabled in appengine-web.xml. To enable sessions, put <sessions-enabled>true</sessions-enabled> in that file. Without it, getSession() is allowed, but manipulation of sessionattributes is not.
[java] at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.throwException(StubSessionManager.java:67)
[java] at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.setAttribute(StubSessionManager.java:63)
[java] at org.apache.jasper.runtime.PageContextImpl.doSetAttribute(PageContextImpl.java:340)
[java] at org.apache.jasper.runtime.PageContextImpl.access$300(PageContextImpl.java:64)
[java] at org.apache.jasper.runtime.PageContextImpl$4.run(PageContextImpl.java:314)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at org.apache.jasper.runtime.PageContextImpl.setAttribute(PageContextImpl.java:312)
[java] at org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.setResponseLocale(SetLocaleSupport.java:209)
[java] at org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.doEndTag(SetLocaleSupport.java:108)
[java] at org.apache.jsp.WEB_002dINF.update_005fevent_jsp._jspx_meth_fmt_setLocale_0(update_005fevent_jsp.java:362)
[java] at org.apache.jsp.WEB_002dINF.update_005fevent_jsp._jspService(update_005fevent_jsp.java:117)
[java] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
[java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
[java] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
[java] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
[java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java] at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
[java] at com.cj.trim.trimFilter.doFilter(Unknown Source)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.queerartfilm.web.JSTLConfigFilter.doFilter(JSTLConfigFilter.java:114)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
[java] at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
[java] at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
[java] at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
[java] at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
[java] at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
[java] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[java] at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
[java] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[java] at org.mortbay.jetty.Server.handle(Server.java:326)
[java] at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
[java] at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
[java] at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
[java] at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
[java] at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
[java] at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
[java] at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
[java]2010年8月17日凌晨2:41:26 com.google.apphosting.utils.jetty.JettyLogger警告
[java]警告:/manage/events/new
[java]java.lang.RuntimeException:appengine-web.xml中未启用会话支持。要启用会话,请在该文件中设置true。没有它,getSession()是允许的,但是sessionattributes的操作是不允许的。
[java]位于com.google.apphosting.utils.jetty.StubSessionManager$StubSession.ThroweException(StubSessionManager.java:67)
[java]位于com.google.apphosting.utils.jetty.StubSessionManager$StubSession.setAttribute(StubSessionManager.java:63)
[java]位于org.apache.jasper.runtime.PageContextImpl.doSetAttribute(PageContextImpl.java:340)
[java]位于org.apache.jasper.runtime.PageContextImpl.access$300(PageContextImpl.java:64)
[java]位于org.apache.jasper.runtime.PageContextImpl$4.run(PageContextImpl.java:314)
[java]位于java.security.AccessController.doPrivileged(本机方法)
[java]位于org.apache.jasper.runtime.PageContextImpl.setAttribute(PageContextImpl.java:312)
[java]位于org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.setResponseLocale(SetLocaleSupport.java:209)
[java]位于org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.doEndTag(SetLocaleSupport.java:108)
[java]位于org.apache.jsp.WEB\u 002dINF.update\u 005fevent\u jsp.\u jspx\u meth\u fmt\u setLocale\u 0(update\u 005fevent\u jsp.java:362)
[java]位于org.apache.jsp.WEB\u 002dINF.update\u 005fevent\u jsp.\u jsp服务(update\u 005fevent\u jsp.java:117)
[java]位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
[java]位于javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java]位于org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
[java]位于org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
[java]位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
[java]位于com.google.appengine.tools.development.privilegedjsspservlet.access$101(privilegedjsspservlet.java:23)
[java]位于com.google.appengine.tools.development.privilegedjsspservlet$2.run(privilegedjsspservlet.java:59)
[java]位于java.security.AccessController.doPrivileged(本机方法)
[java]位于com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
[java]位于javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java]位于org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
[java]位于com.cj.trim.trimFilter.doFilter(未知源)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java]位于com.queerartfilm.web.JSTLConfigFilter.doFilter(JSTLConfigFilter.java:114)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java]位于com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java]位于com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java]位于com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
[java]位于org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java]位于org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
[java]位于org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
[java]位于org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
[java]位于org.mortbay.jetty.handler.C
[java] Aug 17, 2010 2:41:26 AM com.google.apphosting.utils.jetty.JettyLogger warn
[java] WARNING: /manage/events/new
[java] java.lang.RuntimeException: Session support is not enabled in appengine-web.xml. To enable sessions, put <sessions-enabled>true</sessions-enabled> in that file. Without it, getSession() is allowed, but manipulation of sessionattributes is not.
[java] at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.throwException(StubSessionManager.java:67)
[java] at com.google.apphosting.utils.jetty.StubSessionManager$StubSession.setAttribute(StubSessionManager.java:63)
[java] at org.apache.jasper.runtime.PageContextImpl.doSetAttribute(PageContextImpl.java:340)
[java] at org.apache.jasper.runtime.PageContextImpl.access$300(PageContextImpl.java:64)
[java] at org.apache.jasper.runtime.PageContextImpl$4.run(PageContextImpl.java:314)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at org.apache.jasper.runtime.PageContextImpl.setAttribute(PageContextImpl.java:312)
[java] at org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.setResponseLocale(SetLocaleSupport.java:209)
[java] at org.apache.taglibs.standard.tag.common.fmt.SetLocaleSupport.doEndTag(SetLocaleSupport.java:108)
[java] at org.apache.jsp.WEB_002dINF.update_005fevent_jsp._jspx_meth_fmt_setLocale_0(update_005fevent_jsp.java:362)
[java] at org.apache.jsp.WEB_002dINF.update_005fevent_jsp._jspService(update_005fevent_jsp.java:117)
[java] at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
[java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java] at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
[java] at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
[java] at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
[java] at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
[java] at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
[java] at com.cj.trim.trimFilter.doFilter(Unknown Source)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.queerartfilm.web.JSTLConfigFilter.doFilter(JSTLConfigFilter.java:114)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
[java] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
[java] at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
[java] at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
[java] at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
[java] at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
[java] at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
[java] at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
[java] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[java] at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
[java] at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
[java] at org.mortbay.jetty.Server.handle(Server.java:326)
[java] at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
[java] at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
[java] at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
[java] at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
[java] at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
[java] at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
[java] at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
package com.example;
import java.text.SimpleDateFormat;
import java.util.Date;
public final class Functions {
private Functions() {
//
}
public static String formatDate(Date date, String pattern) {
return new SimpleDateFormat(pattern).format(date);
}
}
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.jsp.jstl.core.Config;
public class JSTLConfigFilter implements Filter {
private static final String[] JSTL_CONFIG_PARAMS = { Config.FMT_FALLBACK_LOCALE,
Config.FMT_LOCALE,
Config.FMT_LOCALIZATION_CONTEXT,
Config.FMT_TIME_ZONE,
Config.SQL_DATA_SOURCE,
Config.SQL_MAX_ROWS };
private final Map<String, String> jstlConfig = new ConcurrentHashMap<String, String>();
public void init(FilterConfig config) throws ServletException {
ServletContext ctx = config.getServletContext();
for (String param : JSTL_CONFIG_PARAMS) {
String value = ctx.getInitParameter(param);
if (value != null) {
this.jstlConfig.put(param, value);
}
}
}
public void destroy() {
this.jstlConfig.clear();
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
for (Map.Entry<String, String> entry : this.jstlConfig.entrySet()) {
Config.set(request, entry.getKey(), entry.getValue());
}
chain.doFilter(request, response);
}
}
static void setResponseLocale(PageContext pc, Locale locale) {
.../...
// get response character encoding and store it in session attribute
if (pc.getSession() != null) {
try {
pc.setAttribute(RequestEncodingSupport.REQUEST_CHAR_SET,
response.getCharacterEncoding(),
PageContext.SESSION_SCOPE);
} catch (IllegalStateException ex) {} // invalidated session ignored
}
}
package com.your.company;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionContext;
import org.apache.log4j.Logger;
public class StatelessRequestFilter implements Filter
{
private FilterConfig config;
public void init( FilterConfig config )
throws ServletException
{
if( logger().isDebugEnabled() )
{
logger().debug( "init() called" );
}
this.config = config;
if( logger().isInfoEnabled() )
{
// Look for any configuration name/value pairs. These will be considered valid
// pseudo session attributes. If a set operation tries to set one of these
// properties, it will be ignored -- as opposed to throwing an exception
Enumeration<String> initParamNames = config.getInitParameterNames();
while( initParamNames.hasMoreElements() )
{
logger().info( "init(): attributes defined in the filter configuration..." );
String paramName = initParamNames.nextElement();
String paramValue = config.getInitParameter( paramName );
logger().info( "init(): " + paramName + " = " + paramValue );
}
}
}
/**
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain )
throws IOException, ServletException
{
if( logger().isInfoEnabled() )
{
logger().info( "doFilter(): wrapping request with StatelessHttpRequestWrapper" );
}
ServletRequest weDontNeedNoStinkinSessionsRequest = new StatelessHttpRequestWrapper(
(HttpServletRequest) request );
chain.doFilter( weDontNeedNoStinkinSessionsRequest, response );
}
public void destroy()
{
if( logger().isDebugEnabled() )
{
logger().debug( "destroy() called" );
}
}
public class StatelessHttpRequestWrapper extends HttpServletRequestWrapper
{
public StatelessHttpRequestWrapper( HttpServletRequest request )
{
super( request );
}
/**
* @see javax.servlet.http.HttpServletRequestWrapper#getSession()
*
* @return
*/
@Override
public HttpSession getSession()
{
return statelessSession;
}
/**
* @see javax.servlet.http.HttpServletRequestWrapper#getSession(boolean)
*
* @param create
* @return
*/
@Override
public HttpSession getSession( boolean create )
{
if( create == true )
{
logger()
.warn(
"getSession( boolean ): Calling this method with 'true' will NOT create a new HttpSession!" );
}
return statelessSession;
}
}
// This object will be used by all threads going through this filter
private final PseudoHttpSession statelessSession = new PseudoHttpSession();
public class PseudoHttpSession implements HttpSession
{
public Object getAttribute( String arg0 )
{
if( logger().isDebugEnabled() )
{
logger().debug( "getAttribute(): '" + arg0 + "'" );
}
return config.getInitParameter( arg0 );
}
public Enumeration<String> getAttributeNames()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getAttributeNames()" );
}
return config.getInitParameterNames();
}
public long getCreationTime()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getCreationTime()" );
}
return 0;
}
public String getId()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getId()" );
}
return null;
}
public long getLastAccessedTime()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getLastAccessedTime()" );
}
return 0;
}
public int getMaxInactiveInterval()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getMaxInactiveInterval()" );
}
return 0;
}
public ServletContext getServletContext()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getServletContext()" );
}
return null;
}
public HttpSessionContext getSessionContext()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getSessionContext()" );
}
return null;
}
public Object getValue( String arg0 )
{
if( logger().isDebugEnabled() )
{
logger().debug( "getValue(): '" + arg0 + "'" );
}
return null;
}
public String[] getValueNames()
{
if( logger().isDebugEnabled() )
{
logger().debug( "getValueNames()" );
}
return null;
}
public void invalidate()
{
logger().warn( "invalidate(): ignoring request to invalidate session!" );
}
public boolean isNew()
{
if( logger().isDebugEnabled() )
{
logger().debug( "isNew()" );
}
return false;
}
public void putValue( String arg0, Object arg1 )
{
if( logger().isDebugEnabled() )
{
logger().debug( "putValue(): '" + arg0 + "'" + ": " + arg1 );
}
String configAttribute = config.getInitParameter( arg0 );
if( configAttribute == null )
{
logger().error( "putValue(): unconfigured attribute: " + arg0 );
throw new UnsupportedOperationException(
"PseudoHttpSession cannot be used to store state, hence the 'pseudo' part of the name" );
}
}
public void setAttribute( String arg0, Object arg1 )
{
if( logger().isDebugEnabled() )
{
logger().debug( "setAttribute(): '" + arg0 + "'" + ": " + arg1 );
}
String configAttribute = config.getInitParameter( arg0 );
if( configAttribute == null )
{
logger().error( "setAttribute(): unconfigured attribute: " + arg0 );
throw new UnsupportedOperationException(
"PseudoHttpSession cannot be used to store state, hence the 'pseudo' part of the name" );
}
}
public void removeAttribute( String arg0 )
{
logger().warn( "removeAttribute(): '" + arg0 + "' ignored!" );
}
public void removeValue( String arg0 )
{
logger().warn( "removeValue(): '" + arg0 + "' ignored!" );
}
public void setMaxInactiveInterval( int arg0 )
{
if( logger().isDebugEnabled() )
{
logger().debug( "setMaxInactiveInterval(): '" + arg0 + "'" );
}
logger().warn( "setMaxInactiveInterval(): call ignored!" );
}
}
private Logger logger()
{
return Logger.getLogger( this.getClass() );
}
}
<!-- The 'WeDontNeedNoStinkinSessions' filter will wrap the incoming HTTP request to
override the getSession() methods to return a 'PseudoHttpSession'. This object
prevents creation of servlet sessions. The request is only wrapped if the
HttpServletRequest.getUserPrincipal() method returns 'null'. -->
<filter>
<filter-name>WeDontNeedNoStinkinSessionsFilter</filter-name>
<filter-class>com.sherwin.sd.web.filter.StatelessRequestFilter</filter-class>
<!--
PseudoHttpSession with treat any 'init-param' name/value pairs as legal session-scope
attributes. If a session attempts to set an attribute whose name matches an init-param
below, the setAttribute() call is ignored, as opposed to raising an exception. When
getAttribute() is called, the param-value is returned.
For example, when in contribution mode, something attempts to save a character
encoding to the session. Since this value is always the same (and to the best
of our knowledge never used!), it is reasonable to treat this as a static, configurable
property.
-->
<init-param>
<param-name>javax.servlet.jsp.jstl.fmt.request.charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- The 'WeDontNeedNoStinkinSessions' is applied to all FORWARDs. -->
<filter-mapping>
<filter-name>WeDontNeedNoStinkinSessionsFilter</filter-name>
<url-pattern>/whatever/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<%@ page session="false" %>