HrFlick
Mar 30th, 2010, 06:50 AM
Hi.
We are using the Spring CharacterEncodingFilter (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/filter/CharacterEncodingFilter.html) to handle UTF-8 encoded query parameters.
This stopped working when we deployed our application to tc Server Developer Edition. A little debugging showed the reason to be that org.apache.catalina.connector.Request.parseParamet ers is called before the filters are processed when Insight is active:
Vanilla Tomcat
The filter is applied first:
at org.apache.coyote.Request.setCharacterEncoding(Req uest.java:277)
at org.apache.catalina.connector.Request.setCharacter Encoding(Request.java:1480)
at org.apache.catalina.connector.RequestFacade.setCha racterEncoding(RequestFacade.java:307)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :83)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
...then the parameter parsing:
at org.apache.catalina.connector.Request.parseParamet ers(Request.java:2436)
at org.apache.catalina.connector.Request.getParameter Names(Request.java:1082)
at org.apache.catalina.connector.RequestFacade.getPar ameterNames(RequestFacade.java:371)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.server.impl.container.servlet.Threa dLocalInvoker.invoke(ThreadLocalInvoker.java:90)
at $Proxy32.getParameterNames(Unknown Source)
at org.springframework.web.util.WebUtils.getParameter sStartingWith(WebUtils.java:598)
at org.springframework.web.bind.ServletRequestParamet erPropertyValues.<init>(ServletRequestParameterPropertyValues.java:77)
at org.springframework.web.bind.ServletRequestParamet erPropertyValues.<init>(ServletRequestParameterPropertyValues.java:51)
at org.springframework.web.bind.ServletRequestDataBin der.bind(ServletRequestDataBinder.java:105)
at no.eniro.ecs.web.jersey.CommandBeanProvider.bindFr omQuery(CommandBeanProvider.java:86)
at no.eniro.ecs.web.jersey.CommandBeanProvider.bindDa ta(CommandBeanProvider.java:78)
at no.eniro.ecs.web.jersey.CommandBeanProvider.access $000(CommandBeanProvider.java:53)
at no.eniro.ecs.web.jersey.CommandBeanProvider$1.getV alue(CommandBeanProvider.java:71)
at com.sun.jersey.server.impl.inject.AbstractHttpCont extInjectable$1.getValue(AbstractHttpContextInject able.java:100)
at com.sun.jersey.server.impl.inject.InjectableValues Provider.getInjectableValues(InjectableValuesProvi der.java:79)
at com.sun.jersey.server.impl.model.method.dispatch.A bstractResourceMethodDispatchProvider$EntityParamI nInvoker.getParams(AbstractResourceMethodDispatchP rovider.java:126)
at com.sun.jersey.server.impl.model.method.dispatch.A bstractResourceMethodDispatchProvider$TypeOutInvok er._dispatch(AbstractResourceMethodDispatchProvide r.java:154)
at com.sun.jersey.server.impl.model.method.dispatch.R esourceJavaMethodDispatcher.dispatch(ResourceJavaM ethodDispatcher.java:67)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRul e.accept(HttpMethodRule.java:208)
at com.sun.jersey.server.impl.uri.rules.RightHandPath Rule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.ResourceClass Rule.accept(ResourceClassRule.java:75)
at com.sun.jersey.server.impl.uri.rules.RightHandPath Rule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.RootResourceC lassesRule.accept(RootResourceClassesRule.java:67)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl._handleRequest(WebApplicationImpl.java:775 )
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:740)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:731)
at com.sun.jersey.spi.container.servlet.WebComponent. service(WebComponent.java:372)
at com.sun.jersey.spi.container.servlet.ServletContai ner.service(ServletContainer.java:452)
at com.sun.jersey.spi.container.servlet.ServletContai ner.service(ServletContainer.java:633)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:717)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at no.findexa.common.security.SecurityContextFilter.d oFilterInternal(SecurityContextFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :88)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
Insight
Parameter parsing occours first:
at org.apache.catalina.connector.Request.parseParamet ers(Request.java:2436)
at org.apache.catalina.connector.Request.getParameter Names(Request.java:1082)
at org.apache.catalina.connector.Request.getParameter Map(Request.java:1062)
at com.springsource.metrics.collection.web.HttpReques tDetailsBean.setQueryParams(HttpRequestDetailsBean .java:62)
at com.springsource.metrics.collection.web.HttpReques tDetailsBean.<init>(HttpRequestDetailsBean.java:41)
at com.springsource.metrics.collection.web.HttpReques tMetricCollectionValve.invoke(HttpRequestMetricCol lectionValve.java:33)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
..then the filter is applied:
at org.apache.coyote.Request.setCharacterEncoding(Req uest.java:277)
at org.apache.catalina.connector.Request.setCharacter Encoding(Request.java:1480)
at org.apache.catalina.connector.RequestFacade.setCha racterEncoding(RequestFacade.java:307)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :83)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at com.springsource.metrics.collection.web.HttpReques tMetricCollectionValve.invoke(HttpRequestMetricCol lectionValve.java:44)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
Should i report this as a bug, or is it expected behaviour?
Does anybody know if there is a way to work around this by changing the default tc Server Developer Edition configuration?
Regards
Christian
We are using the Spring CharacterEncodingFilter (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/filter/CharacterEncodingFilter.html) to handle UTF-8 encoded query parameters.
This stopped working when we deployed our application to tc Server Developer Edition. A little debugging showed the reason to be that org.apache.catalina.connector.Request.parseParamet ers is called before the filters are processed when Insight is active:
Vanilla Tomcat
The filter is applied first:
at org.apache.coyote.Request.setCharacterEncoding(Req uest.java:277)
at org.apache.catalina.connector.Request.setCharacter Encoding(Request.java:1480)
at org.apache.catalina.connector.RequestFacade.setCha racterEncoding(RequestFacade.java:307)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :83)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
...then the parameter parsing:
at org.apache.catalina.connector.Request.parseParamet ers(Request.java:2436)
at org.apache.catalina.connector.Request.getParameter Names(Request.java:1082)
at org.apache.catalina.connector.RequestFacade.getPar ameterNames(RequestFacade.java:371)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.jersey.server.impl.container.servlet.Threa dLocalInvoker.invoke(ThreadLocalInvoker.java:90)
at $Proxy32.getParameterNames(Unknown Source)
at org.springframework.web.util.WebUtils.getParameter sStartingWith(WebUtils.java:598)
at org.springframework.web.bind.ServletRequestParamet erPropertyValues.<init>(ServletRequestParameterPropertyValues.java:77)
at org.springframework.web.bind.ServletRequestParamet erPropertyValues.<init>(ServletRequestParameterPropertyValues.java:51)
at org.springframework.web.bind.ServletRequestDataBin der.bind(ServletRequestDataBinder.java:105)
at no.eniro.ecs.web.jersey.CommandBeanProvider.bindFr omQuery(CommandBeanProvider.java:86)
at no.eniro.ecs.web.jersey.CommandBeanProvider.bindDa ta(CommandBeanProvider.java:78)
at no.eniro.ecs.web.jersey.CommandBeanProvider.access $000(CommandBeanProvider.java:53)
at no.eniro.ecs.web.jersey.CommandBeanProvider$1.getV alue(CommandBeanProvider.java:71)
at com.sun.jersey.server.impl.inject.AbstractHttpCont extInjectable$1.getValue(AbstractHttpContextInject able.java:100)
at com.sun.jersey.server.impl.inject.InjectableValues Provider.getInjectableValues(InjectableValuesProvi der.java:79)
at com.sun.jersey.server.impl.model.method.dispatch.A bstractResourceMethodDispatchProvider$EntityParamI nInvoker.getParams(AbstractResourceMethodDispatchP rovider.java:126)
at com.sun.jersey.server.impl.model.method.dispatch.A bstractResourceMethodDispatchProvider$TypeOutInvok er._dispatch(AbstractResourceMethodDispatchProvide r.java:154)
at com.sun.jersey.server.impl.model.method.dispatch.R esourceJavaMethodDispatcher.dispatch(ResourceJavaM ethodDispatcher.java:67)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRul e.accept(HttpMethodRule.java:208)
at com.sun.jersey.server.impl.uri.rules.RightHandPath Rule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.ResourceClass Rule.accept(ResourceClassRule.java:75)
at com.sun.jersey.server.impl.uri.rules.RightHandPath Rule.accept(RightHandPathRule.java:115)
at com.sun.jersey.server.impl.uri.rules.RootResourceC lassesRule.accept(RootResourceClassesRule.java:67)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl._handleRequest(WebApplicationImpl.java:775 )
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:740)
at com.sun.jersey.server.impl.application.WebApplicat ionImpl.handleRequest(WebApplicationImpl.java:731)
at com.sun.jersey.spi.container.servlet.WebComponent. service(WebComponent.java:372)
at com.sun.jersey.spi.container.servlet.ServletContai ner.service(ServletContainer.java:452)
at com.sun.jersey.spi.container.servlet.ServletContai ner.service(ServletContainer.java:633)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:717)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at no.findexa.common.security.SecurityContextFilter.d oFilterInternal(SecurityContextFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :88)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
Insight
Parameter parsing occours first:
at org.apache.catalina.connector.Request.parseParamet ers(Request.java:2436)
at org.apache.catalina.connector.Request.getParameter Names(Request.java:1082)
at org.apache.catalina.connector.Request.getParameter Map(Request.java:1062)
at com.springsource.metrics.collection.web.HttpReques tDetailsBean.setQueryParams(HttpRequestDetailsBean .java:62)
at com.springsource.metrics.collection.web.HttpReques tDetailsBean.<init>(HttpRequestDetailsBean.java:41)
at com.springsource.metrics.collection.web.HttpReques tMetricCollectionValve.invoke(HttpRequestMetricCol lectionValve.java:33)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
..then the filter is applied:
at org.apache.coyote.Request.setCharacterEncoding(Req uest.java:277)
at org.apache.catalina.connector.Request.setCharacter Encoding(Request.java:1480)
at org.apache.catalina.connector.RequestFacade.setCha racterEncoding(RequestFacade.java:307)
at org.springframework.web.filter.CharacterEncodingFi lter.doFilterInternal(CharacterEncodingFilter.java :83)
at org.springframework.web.filter.OncePerRequestFilte r.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:191)
at com.springsource.metrics.collection.web.HttpReques tMetricCollectionValve.invoke(HttpRequestMetricCol lectionValve.java:44)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:849)
Should i report this as a bug, or is it expected behaviour?
Does anybody know if there is a way to work around this by changing the default tc Server Developer Edition configuration?
Regards
Christian