如何使用默认参数将纯servlet url重定向到同一个servlet?

时间:2014-11-17 15:13:26

标签: tomcat servlets redirect

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

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

我知道可以使用Apache和.htaccess使用rewrite engine进行重定向。但是,我想知道是否还有其他方法只依赖于tomcat。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

只是为了完整起见。根据{{​​3}},我找到了一个更简单的解决方案:

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
}