The code for the Filter implementation:
public class SimpleFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if(servletRequest instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest =
(HttpServletRequest)servletRequest;
FakeHeadersRequest request = new
FakeHeadersRequest(httpServletRequest);
filterChain.doFilter(request, servletResponse);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
return;
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
The code for the Valve subclass:
public class ModifyHeaderValve extends ValveBase {
public void invoke(Request request, Response response, ValveContext
valveContext)
throws IOException, ServletException {
if(
!(request instanceof HttpRequest) ||
!(response instanceof HttpResponse)
) {
valveContext.invokeNext(request, response);
return;
}
if(
!(request.getRequest() instanceof HttpServletRequest) ||
!(response.getResponse() instanceof HttpServletResponse)
) {
valveContext.invokeNext(request, response);
return;
}
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
FakeHeadersRequest fakeHeadersRequest = new
FakeHeadersRequest(httpServletRequest);
String value = fakeHeadersRequest.getHeader(username);
valveContext.invokeNext(request, response);
return;
}
}
The code for the FakeHeadersRequest:
public class FakeHeadersRequest extends HttpServletRequestWrapper {
public FakeHeadersRequest(HttpServletRequest request) {
super(request);
}
public String getHeader(String name) {
HttpServletRequest request = (HttpServletRequest)getRequest();
if(username.equals(name)) {
Cookie[] cookies = request.getCookies();
for(int i=0; i cookies.length; i++) {
if(username.equals(cookies[i].getName())) {
String val = cookies[i].getValue();
return val;
}
}
}
return request.getHeader(name);
}
public Enumeration getHeaderNames() {
List list = new ArrayList();
HttpServletRequest request = (HttpServletRequest)getRequest();
Enumeration e = request.getHeaderNames();
while(e.hasMoreElements()) {
String n = (String)e.nextElement();
list.add(n);
}
list.add(username);
Enumeration en = Collections.enumeration(list);
return en;
}
}
On Thu, Feb 12, 2009 at 3:05 AM, Kees de Kooter kdekoo...@gmail.com wrote:
Could you post the code of your valve and your filter?
Please also not that a Valve is a tomcat specific thing i.e. not
portable to other app servers. A Filter is part of the servlet spec
and portable.
On Thu, Feb 12, 2009 at 06:13, Jake Vang vangj...@googlemail.com wrote:
I've been looking for a way to modify my request header. I found that
implementing javax.servlet.Filter is the way to go. However, I noticed
that
once after I got my Filter implementation working, my Valve is no longer
reached (I created my own Valve subclassing
org.apache.catalina.valves.ValveBase). I've determined this because I've
placed breakpoints in the Filter.doFilter(...) method and
Valve.invoke(...)
methods, and only the breakpoint in the Filter class implementation is
caught.
My context XML for my web application is:
?xml version=1.0 encoding=UTF-8?
Context path=/my-valve
docBase=C:\my-valve\dist
reloadable=true
Valve className=vang.jake.tomcat.valve.ModifyHeaderValve /
/Context
My web.xml for my web application is:
filter
filter-namesimpleFilter/filter-name
filter-classvang.jake.servlet.filter.SimpleFilter/filter-class
/filter
filter-mapping
filter-namesimpleFilter/filter-name
url-pattern/*/url-pattern
/filter-mapping
Could someone clarify if the use of one (filter) precludes the use of the
other (valve)? If so, why? If not, why is my valve never reached?
Thanks.
-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org