Uso de Filtros para Obtener Parámetros en Lugar de JSP

  1. 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>

Etiquetas: java servlet Filter spring-mvc jsp

Publicado el 6-27 01:03