
Me gustaría simplificar las URL para acceder a una aplicación Glassfish V3 eliminando las extensiones de archivo y acortando las URL.
Ya configuré mi aplicación como aplicación predeterminada, por lo que no es necesario incluir la raíz de contexto en la URL.
Me gustaría:
* Eliminar extensiones de archivo
* Acortar la URL a archivos que se encuentran en lo más profundo de la estructura de carpetas
Me gustaría hacer esto usando la coincidencia de patrones en lugar de por archivo (el sitio es pequeño en este momento, pero cambiará con frecuencia y crecerá).
Algunos ejemplos de lo que me gustaría hacer:
* foo.com/bar.html -> foo.com/bar
* foo.com/folder1/folder2/bar2.html -> foo.com/bar2
Cualquier ayuda sería muy apreciada. Gracias.
Salud,
Jin
Respuesta1
Tomado dehttp://www.sun.com/bigadmin/sundocs/articles/urlrdn.jspParece que esto es lo que estás buscando.
Redirección de URL dentro de un dominio
Puede utilizar el elemento url-prefix de la propiedad redirigir_ para reenviar una URL a otra URL en el mismo dominio.
El siguiente procedimiento muestra cómo permitir que los visitantes de un sitio web escribanhttp://www.mywebsite.com/myproduct1y ser redirigido o reenviado ahttp://www.mywebsite.com/mywarname/products/myproduct1.jsp.
- Inicie sesión en la Consola de administración de Sun Java System Application Server o GlassFish.
- En la Consola de administración, expanda el nodo Configuraciones.
Expanda el nodo server-config.
Ignore este paso si está ejecutando un dominio de desarrollador (un dominio que no tiene capacidad de agrupación en clústeres).
Expanda Servicio HTTP.
- Expanda Servidores virtuales.
- Haga clic en servidor.
- En la página Editar servidor virtual, haga clic en el botón Agregar propiedad.
- En la columna Nombre, escriba
redirect_1
. Si está utilizando Application Server 9.0, escriba
from=/<context-root>/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
en la columna Valor.Nota- El valor que
<context-root>
proporcione aquí debe coincidir con el valor de la raíz de contexto especificada en el archivo web.xml o application.xml.Si está utilizando Application Server 9.1, escriba
from=/myproduct1 url-prefix=/mywarname/mypages/products/myproduct1.jsp
en la columna Valor.
Respuesta2
En este caso, debería escribir una implementación javax.servlet.Filter que reconozca las URL acortadas y reenvíe las solicitudes al objetivo real.
/**
*
* @author vrg
*/
@WebFilter(filterName = "SimplifiedUrlRequestDispatcher", urlPatterns = {"/*"})
public class ShortenedUrlRequestDispatcher implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//reading configuration from filterConfig
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String shortURI = httpRequest.getRequestURI();
String realURI = getRealURI(shortURI);
if (realURI == null) {
//in this case the filter should be transparent
chain.doFilter(request, response);
} else {
//forwarding request to the real URI:
RequestDispatcher rd = request.getRequestDispatcher(realURI);
rd.forward(request, response);
}
}
/**
* Calculates the real URI from the given URI if this is a shortened one,
* otherwise returns null.
* @param shortURI
* @return
*/
private String getRealURI(String shortURI) {
//TODO implement your own logic using regexp, or anything you like
return null;
}
@Override
public void destroy() {
}
}
Respuesta3
privado! Excelente manual, pero una cosa más: RequestDispatcher rd = request.getRequestDispatcher(realURI);
opera con la ruta del servlet, al obtener el URI con el nombre de la aplicación, dará un error. Entonces, req.getServletPath()
proporciona un camino correcto sin contexto y el despachador funciona como debería.