- Implementación de un filtro
En lugar de utilizar JSP para manejar parámetros, podemos implementar un filtro de servlet que intercepte las solicitudes. A continuación se muestra un ejemplo de códiggo.
package core.filtros;
import java.io.IOException; import java.util.Enumeration;
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.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class FiltroParametros implements Filter {
@Override
public void doFilter(ServletRequest solicitud, ServletResponse respuesta, FilterChain cadena) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) solicitud;
HttpServletResponse res = (HttpServletResponse) respuesta;
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");
res.setHeader("Access-Control-Allow-Origin", "*");
String uri = normalizarRuta(req.getRequestURI());
String contexto = req.getContextPath();
Enumeration> parametros = solicitud.getParameterNames();
StringBuilder parametrosStr = new StringBuilder();
while(parametros.hasMoreElements()){
String nombreParam = (String)parametros.nextElement();
parametrosStr.append("&").append(nombreParam).append("=").append(solicitud.getParameter(nombreParam));
}
if(uri.contains(".")) {
res.sendRedirect(contexto + "/html/ir?rutaPagina=" + uri.substring(contexto.length()+1, uri.indexOf(".")) + parametrosStr);
return;
}
cadena.doFilter(req, res);
}
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void destroy() {
}
private String normalizarRuta(String url){
while(url.contains("//")){
url = url.replace("//", "/");
}
if(url.contains(":")){
url = url.replace(":", ":/");
}
return url;
}
}
</div>2. Configuración en web.xml
---------------------------
Para que el filtro sea aplicado a todas las solicitudes con extensión .html, se debe configurar en el archivo web.xml.
<div>```
<!-- Configuración del filtro -->
<filter>
<filter-name>filtroParametros</filter-name>
<filter-class>core.filtros.FiltroParametros</filter-class>
</filter>
<filter-mapping>
<filter-name>filtroParametros</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
El controlador de Spring MVC se encarga de manejar la solicitud redirigida y preparar la vista con los parámetros necesarios.
package module.controladores;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;
import core.common.springmvc.ControladorBase;
@Controller @RequestMapping("/html") public class ControladorHTML extends ControladorBase {
@RequestMapping("/ir")
@ResponseBody
public ModelAndView ir(HttpServletRequest solicitud, String rutaPagina, String parametros) {
ModelAndView vista = new ModelAndView();
String raiz = solicitud.getScheme() + "://" + solicitud.getServerName() + ":" + solicitud.getServerPort();
String base = raiz + solicitud.getContextPath() + "/";
raiz += "/";
String titulo = solicitud.getParameter("nombre");
vista.setViewName(rutaPagina);
vista.addObject("raiz", raiz);
vista.addObject("base", base);
Object objeto = null;
try {
objeto = JSON.parse(parametros);
if (!(objeto instanceof JSONObject)) {
parametros = "{}";
}
} catch (Exception e) {
parametros = "{}";
}
vista.addObject("parametros", parametros);
vista.addObject("titulo", titulo == null ? "" : titulo);
return vista;
}
}
</div>4. Uso en la página HTML
------------------------
Finalmente, en la página HTML, se pueden acceder a las variables pasadas a través de los atributos del modelo.
<div>```
<html lang="es" allowtransparency="true">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>vcn</title>
<link rel="stylesheet" href="${base}/static/css/reset.css" />
<link rel="stylesheet" href="${base}/pages/vcn/css/vcn.css" />
</head>
<body>
<div class="to_video2 _one">
<iframe src="${base}/pages/vcn/vcnbutton.html?parametros={num:0}" frameBorder="0" marginHeight="0" marginWidth="0">bueno</iframe>
</div>
<div class="to_video2 _two">
<iframe src="${base}/pages/vcn/vcnbutton.html?parametros={num:1}" frameBorder="0" marginHeight="0" marginWidth="0">bueno</iframe>
</div>
<div class="videoroad-box2" >
<object id="vcnocx" width="100%" height="100%" CLASSID="CLSID:3556A474-8B23-496F-9E5D-38F7B74654F4"></object>
</div>
</body>
<script type="text/javascript">
var base = '${base}';
var raiz = '${raiz}';
var parametros = ${parametros};
var pagina = {
"inicializar": function () {
loginVCN(vcn2road);
}
};
</script>
<script src='${base}/plugins/jquery/jquery-3.3.1.min.js'></script>
<script src="${raiz}/libs/resafety/build/resafety-1.19.5.js"></script>
<script src="${base}/pages/vcn/js/vcn.js"></script>
</html>