Se expone un ejemplo práctico en el que se implementa un filtro web que permite la sustitución de una cadena de textos al servir el servidor web (en nuestro caso un Tomcat) un archivo xsl. Este ejemplo nos permitirá adentrarnos en el funcionamiento de los filtros y de la clase ServletResponse.
Para comenzar explicaremos que un filtro web son una clases java que se ejecutan cuando se realizar cualquier petición al servidor que concuerde con la configuración de este, por tanto podrá modificar la salida, controlar el acceso a determinados recursos, etc
En el siguiente ejemplo se expone la clase que implementa en sí el filtro.
package xslfix.filter
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class XSLFilter implements Filter {
private final static String WORD1 = "method=\"xhtml\"";
private final static String WORD2 = "method=\"html\"";
private final static String CONTEN_TYPE_XSL = "text/xml";
public static final Logger logger = Logger.getLogger(XSLFilter.class);
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (logger.isDebugEnabled())
logger.debug("| doFilter | TRACE --> METHOD_BEGIN");
HttpServletResponse resp = (HttpServletResponse)res;
FilterHttpServletResponseWrapper resSuplantada = new FilterHttpServletResponseWrapper(resp);
chain.doFilter( req, resSuplantada );
if (resSuplantada.getContentType()!=null && resSuplantada.getContentType().equalsIgnoreCase(CONTEN_TYPE_XSL))
{
if (logger.isDebugEnabled())
logger.debug("| doFilter | TRACE --> contentType: "+resSuplantada.getContentType());
resSuplantada.replace(WORD1,WORD2);
}
byte[] auxBytes = resSuplantada.getContent().getBytes();
resp.setContentLength(auxBytes.length);
resp.getOutputStream().write(auxBytes);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
if (logger.isDebugEnabled())
logger.debug("| init | TRACE --> METHOD_BEGIN");
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}
De este código destaca la línea:
Chain.doFilter (req, resSuplantada)
Que ejecutará la lógica de la petición realizada, por tanto podremos hacer los cambios antes o como es este caso después, ya que después de esta línea tendremos acceso al fichero xsl pedido por la aplicación web.
Vemos que tenemos que pasarle un ServletResponse, en nuestro caso hemos realizado una clase que hereda de esta y que hemos modificado para poder tener acceso a su contenido y poder manipularlo a nuestro antojo.
Por último vemos que tenemos que escupir la salida, para lo cual lo haremos sobre el objeto ServletResponse original y que se hace con la línea de código:
resp.getOutputStream().write(auxBytes);
Veamos la clase que hemos implementado para sustituir ServletResponse, la hemos llamado FilterHttpServletResponseWrapper, vemos que en vez de ser hija de ServletResponse lo es de HttpServletResponseWrapper que nos facilita la manipulación de su contenido.
package xslfix.filter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class FilterHttpServletResponseWrapper extends HttpServletResponseWrapper{
private StringOutputStream pw = new StringOutputStream();
public FilterHttpServletResponseWrapper(HttpServletResponse aux)
{
super(aux);
}
public String getContent()
{
return pw.toString();
}
/* public String getContentType()
{
return getContentType();
}*/
public void replace (String param1, String param2)
{
pw.replace(param1, param2);
}
/*public PrintWriter getWriter() {
return getWriter();
}*/
public ServletOutputStream getOutputStream() {
return pw;
}
public void setContentType(String type) {
super.setContentType(type);
}
}
Vemos que tiene un método llamado replace, que es el que nos permite modificar su contenido.
También podemos observar que tiene un objeto de la clase StringOutputStream y llamado pw, en este objeto es donde se almacenará automáticamente el contenido de la xsl. Le hemos añadido unos métodos, para convertir su contenido en un String y poder remplazar lo que necesitemos de ella.
package xslfix.filter;
import javax.servlet.ServletOutputStream;
public class StringOutputStream extends ServletOutputStream{
// This buffer will contain the stream
protected StringBuffer buf = new StringBuffer();public StringOutputStream() {}
public void close() {}
public void flush() {
// Clear the buffer
buf.delete(0, buf.length());
}public void write(byte[] b) {
String str = new String(b);
this.buf.append(str);
}
public void write(byte[] b, int off, int len) {
String str = new String(b, off, len);
this.buf.append(str);
}public void write(int b) {
String str = Integer.toString(b);
this.buf.append(str);
}public String toString() {
return buf.toString();
}
public void replace(String param1, String param2)
{
int indexStart =buf.indexOf(param1);
if (indexStart>=0)
{
buf.replace(indexStart,indexStart+param1.length(),param2);
}
}
}
Ahora nos faltará modificar el archivo web.xml para que nos reconozca el filtro para lo cual añadiremos las siguientes líneas:
<filter>
<filter-name>XSLFilter</filter-name>
<filter-class>xslfix.filter.XSLFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSLFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
El url-pattern es el patrón que nos indica que entradas coincidentes con el patrón serán tratadas por el filtro.
Daniel P. @ 21:26 | comentarios (0) | Links Permanentes
<< December 2006 >> | ||||||
---|---|---|---|---|---|---|
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
archivos
November - 2013