Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSTL fmt库抛出500错误,是否需要启用会话?_Java_Google App Engine_Jsp_Jstl - Fatal编程技术网

Java JSTL fmt库抛出500错误,是否需要启用会话?

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"

我正在Google App Engine上开发一个简单的servlet/JSP数据驱动网站。我已经开始在一些数据输入表单上使用JSTL fmt库,并且在使用标记
和:

[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" %>