【问题标题】:Static resources versioning in servlet filter (adding an extra GET parameter)servlet 过滤器中的静态资源版本控制(添加额外的 GET 参数)
【发布时间】:2016-02-21 14:00:37
【问题描述】:

我正在尝试实现filter,它将以某种方式将JS url 从/script/script1.js 修改为/scripts/script1.js?version=1.3.2

我试过了:

  1. 使用response.sendRedirect("/scripts/script1.js?version=1.3.2") 我得到了 ERR_TOO_MANY_REDIRECTS 在浏览器控制台日志中。

  2. 使用了RequestWrapper,我在parameterMap参数"version"中添加了值"1.3.2",但它需要以某种方式添加到queryParameters映射中 是否可以在过滤器中添加queryParameters

或者是否有任何解决方案可以在 java filter 中进行此版本控制?

PS:是的,我知道这不是最好的解决方案,我不会使用URLrewriteFilter

【问题讨论】:

    标签: javascript java servlets httprequest servlet-filters


    【解决方案1】:

    是的,我会为此考虑过滤器:

    1.实现一个过滤器,将原始请求封装到一个请求包装器中,该包装器将新参数添加到现有参数中:

    @WebFilter("/scripts/*")
    public class MyFilter implements Filter
    {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException,
            ServletException
        {
            String version=request.getParameter("version");
            if (version == null)
            {
                Map<String, String[]> myParameters=new HashMap<>(request.getParameterMap());
                request=new MyHttpServletRequest((HttpServletRequest)request, myParameters);
            }
            chain.doFilter(request, response);
        }
    
        // ... rest of Filter boilerplate...
    }
    

    2.请求包装器:

    public class MyHttpServletRequest extends HttpServletRequestWrapper
    {
        private final Map<String, String[]> parameters;
    
        public MyHttpServletRequest(HttpServletRequest request, Map<String, String[]> parameters)
        {
            super(request);
            this.parameters=parameters;
        }
    
        @Override
        public String getParameter(String name)
        {
            String[] values=parameters.get(name);
            return values!=null && values.length > 0
                ? values[0]
                : null;
        }
    
        @Override
        public Map<String, String[]> getParameterMap()
        {
            return parameters;
        }
    }
    

    更新

    如果需要覆盖getQueryString方法,可以这样做:

        @Override
        public String getQueryString()
        {
            String s;
            try
            {
                s=super.getQueryString();
                if (s == null)
                {
                    s="?";
                }
                for (Map.Entry<String, String[]> param : getParameterMap().entrySet())
                {
                    s+="&";
                    for (String value : param.getValue())
                    {
                        s+=URLEncoder.encode(param.getKey(), "UTF-8") + "=" + URLEncoder.encode(value, "UTF-8");
                    }
                }
            }
            catch (UnsupportedEncodingException e)
            {
                throw new java.lang.RuntimeException("Exception without treatment", e);
            }
            return s;
        }
    }
    

    【讨论】:

    • 这是一个很好的方法,但问题是 - 当我将参数添加到参数映射中时,它会被忽略,因为没有定义 queryParameters。有什么方法可以让 parameterMap 中的参数出现在 queryParameters 中?
    • @Dmitri Ilaltdinov 16 分钟前它被忽略了吗?您实际上是如何读取参数的?
    • 其实我希望不需要添加任何东西来读取这些参数,我认为如果修改获取请求就足够了
    • 我还没有尝试过,但我忽略了覆盖getQueryString 方法,因为我认为这没有必要。也许是。
    • @Dmitri Ilaltdinov 好吧,我不是要你添加更多内容来读取 HTTP 参数,而是是如何读取它们的直到现在?你是在 从 javascript 阅读它们吗?
    【解决方案2】:

    您的另一个选择是转发来自过滤器的请求:

    RequestDisptacher disp = request.getRequestDisptacher("/scripts/script1.js?version=1.3.2");
    disp.forward(request,response);
    

    如果你这样做,你就不会调用 filter.doChain(request,response)。

    对于转发的请求,“版本”将作为查询参数提供。

    【讨论】:

    • 据我了解,这意味着如果我使用 getRequestDispatcher+forward,在此过滤器之后将不再使用过滤器?
    • 对于入站请求,是的,假设您不调用 doChain()。如果为此配置过滤器,则可以将它们作为转发请求的一部分调用。例如 FORWARD 包含在过滤器映射定义中。
    【解决方案3】:

    您可以在调用该文件的 JSP 文件中执行此过滤器。

    <c:choose>
        <c:when test="${filter.value eq 'xxx'}">
          ... import js here
        </c:when>
        <c:otherwise>
        .... other script
        </c:otherwise>
    </c:choose>
    

    【讨论】:

      猜你喜欢
      • 2013-12-15
      • 2010-12-16
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2013-02-10
      • 2017-12-31
      相关资源
      最近更新 更多