我们有一个由外部供应商提供的Web应用程序。有一个servlet - 如果没有参数调用 - 会引发异常。我们可以访问web.xml
。
是否可以使用默认参数将servlet url http://<server>:8080/<app>/<servlet>
重定向到同一个servlet,例如到http://<server>:8080/<app>/<servlet>?p1=0
?
我知道可以使用Apache和.htaccess
使用rewrite engine进行重定向。但是,我想知道是否还有其他方法只依赖于tomcat。
答案 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
}