【问题标题】:How to redirect pure servlet url to the same servlet with default parameters?如何使用默认参数将纯 servlet url 重定向到同一个 servlet?
【发布时间】:2014-11-17 15:13:25
【问题描述】:

我们有一个由外部供应商提供的网络应用程序。有一个 servlet - 如果在没有参数的情况下调用 - 会引发异常。我们可以访问web.xml

是否可以将 servlet url http://<server>:8080/<app>/<servlet> 重定向到具有默认参数的同一 servlet,例如到http://<server>:8080/<app>/<servlet>?p1=0?

我知道使用 Apache 和 .htaccess 可以使用 rewrite engine 进行重定向。不过不知道有没有其他方式只依赖tomcat。

【问题讨论】:

  • 如果可以改web.xml,也可以写代码。如果需要,您可以在该 servlet 前面添加一个过滤器,该过滤器使用 HttpServletRequestWrapper 添加缺少的参数。或者您可以扩展 servlet 的类(如果该类和相关方法都不是最终的)并实现此功能。然后在web.xml中使用扩展类为servlet-class
  • @NikosParaskevopoulos 您的评论大约提前一小时被编辑,作为下面 worpet 的答案。因为下面的答案包含与您的 cmets 中基本相同的建议,所以我想将您的评论标记为答案。如果您愿意,只需添加您的评论作为答案,我会标记它。如果使用过滤器方法,欢迎提供一些提示如何将默认参数添加到请求中。

标签: tomcat servlets redirect


【解决方案1】:

对于您似乎更喜欢的过滤器解决方案,您首先需要知道您的默认值的HttpServletRequestWrapper 的实现。可能是这样的:

public class SpecializedHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private static final Map<String,String> DEFAULT_VALUES = new HashMap<>();
    static {
        Map<String,String> defaultValues = new HashMap<>();
        defaultValues.put("p1", "0");
        // add other defaults here...
        DEFAULT_VALUES = java.util.Collections.unmodifiableMap(defaultValues);
    }

    public SpecializedHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    public String getParameter(String name) {
        String result = super.getParameter(name);
        if( name == null && DEFAULT_VALUES.containsKey(name) ) {
            result = DEFAULT_VALUES.get(name);
        }
        return result;
    }

    public Map<String,String[]> getParameterMap() {
        // needs implementing!
    }

    public Enumeration<String> getParameterNames() {
        // needs implementing!
    }

    public String[] getParameterValues(String name) {
        // needs implementing!
    }

    ...
}

上面未实现的方法的实现比较复杂,但还是可行的。

那么过滤器代码会简单地做:

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(new SpecializedHttpServletRequestWrapper(request), response);
}

【讨论】:

    【解决方案2】:

    无法像 Apache 那样仅通过配置文件强制重定向。仅使用 Tomcat,您必须通过 Java 代码执行此操作(编写过滤器或 Servlet 以添加缺少的参数值或重定向到包含参数的 URL)。

    【讨论】:

      【解决方案3】:

      只是为了完整性。基于answer from Nikos Paraskevopoulos,我找到了一个更简单的解决方案:

      public class MyFilter implements Filter
      {
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
          {
              if (request instanceof HttpServletRequest && response instanceof HttpServletResponse)
              {
                  HttpServletRequest httpRequest = (HttpServletRequest) request;
                  HttpServletResponse httpResponse = (HttpServletResponse) response;
                  if ( ! httpRequest.getParameterNames().hasMoreElements())
                  {
                      String redirectURL = httpRequest.getRequestURL() + "?p1=0";
                      httpResponse.setStatus(404); // Not found
                      httpResponse.sendRedirect(redirectURL);
                      return;
                  }
              }
              chain.doFilter(request, response);
          }
          ... // implement other interface methods
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 2018-05-19
        相关资源
        最近更新 更多