Thanks for your reply!
I've tried to extend Solr's SolrDispatchFilter class, but that doesn't
work either... as soon as I do anything with the POST data in
doFilter(), I get that error again ... works fine with GET, though
(that's what you are using in your class, too...)
So I'm kinda stuck now... :(
The main problem is, we need to use POST in our application since the
GET requests are too long with all filters applied etc.
And we can't really log the requests then cause you don't get much info
from POST requests in the Tomcat log... but we need to look into the
requests for logging and monitoring. That's why I need to read the POST
data and store it somewhere else to be able to log it with Tomcat later on.
Any more ideas anyone?
Thanks a lot!
Stefan
Am 03.12.2014 um 17:06 schrieb Michael Sokolov:
Stefan I had problems like this -- and the short answer is -- it's a
PITA. Solr is not really designed to be extended in this way. In
fact I believe they are moving towards an architecture where this is
even less possible - folks will be encouraged to run solr using a
bundled exe, perhaps with jetty embedded (I'm not all up to speed on
this, maybe someone will correct me), and no war file shipped.
So perhaps a better strategy is to wrap the service at the HTTP layer
using a proxy.
Still, you can probably fix your immediate problem by extending Solr's
SolrDispatchFilter class. Here's how I did that:
https://github.com/msokolov/lux/blob/master/src/main/java/lux/solr/LuxDispatchFilter.java
-Mike
On 12/03/2014 08:02 AM, Stefan Moises wrote:
Hi again,
just for reference, here is my filter class (taken from the example
posted earlier) - as soon as I iterate over the request parameters,
Solr gets angry... :(
I have also tried HttpServletRequestWrapper, but that didn't help
either... nor did this:
http://ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/
(because I don't want to only add some static values, I still have to
iterate over the original request's parameters to get my desired data
out of the request's POST data....)
Here goes...
public final class PostDataDumperFilter implements Filter {
private FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws
ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
public void setFilterConfig(FilterConfig fc) {
filterConfig=fc;
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse
response,
FilterChain chain) throws IOException, ServletException {
if (filterConfig == null)
return;
HttpServletRequest httpRequest = (HttpServletRequest) request;
// The variable "postdata" is used in the Solr Tomcat Valve
Enumeration<String> names = httpRequest.getParameterNames();
StringBuffer output = new StringBuffer();
boolean skipRequest = false;
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
output.append(name + "=");
String values[] = httpRequest.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (i > 0) {
output.append("&" + name + "=");
}
output.append(values[i]);
// ignore paging requests, where request
parameter "start" is > 0, e.g. "&start=12":
if(name.equalsIgnoreCase("start") &&!
values[i].equals("0")) {
skipRequest = true;
}
}
if (names.hasMoreElements())
output.append("&");
}
if(!skipRequest) {
request.setAttribute("postdata", output);
}
chain.doFilter(request, response);
}
}
Thanks,
Stefan
Am 03.12.2014 um 09:47 schrieb Stefan Moises:
Hi Folks,
I have a problem with an additional servlet filter defined in my
web.xml (Tomcat 7.x).
In Solr 4.2.1. we've successfully used a filter for processing POST
request data (basically, the filter reads the POST data, collects
some parameters from it and writes it back to the request, based on
this example:
http://www.coderanch.com/t/484631/Tomcat/configure-Tomcat-log-POST-data)
To make this work, the filter has to be the first one defined in
the web.xml.
But now in Solr 4.8.0, if we define that filter, Solr complains that
there is a filter before it and claims that we have to remove it:
null:org.apache.solr.common.SolrException: Solr requires that
request parameters sent using application/x-www-form-urlencoded
content-type can be read through the request input stream.
Unfortunately, the stream was empty / not available. This may be
caused by another servlet filter calling
ServletRequest.getParameter*() before SolrDispatchFilter, please
remove it.
at
org.apache.solr.servlet.SolrRequestParsers$FormDataRequestParser.getParameterIncompatibilityException(SolrRequestParsers.java:622)
Here is my web.xml:
<!-- My own filter here... -->
<filter>
<filter-name>post-data-dumper-filter</filter-name>
<filter-class>filters.PostDataDumperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>post-data-dumper-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Any path (name) registered in solrconfig.xml will be sent to
that filter -->
<filter>
<filter-name>SolrRequestFilter</filter-name>
<filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SolrRequestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Any idea how to solve this? Why does Solr have a problem now if
there is any pre-filter defined?
Thanks a lot,
Stefan
--
Mit den besten Grüßen aus Nürnberg,
Stefan Moises
*******************************************
Stefan Moises
Senior Softwareentwickler
Leiter Modulentwicklung
shoptimax GmbH
Ulmenstrasse 52 H
90443 Nürnberg
Amtsgericht Nürnberg HRB 21703
GF Friedrich Schreieck
Fax: 0911/25566-29
moi...@shoptimax.de
http://www.shoptimax.de
*******************************************