停止使用 Java 过滤器提交请求

Stop submit request using Java filter

我有一个 Java 过滤器,允许根据 URL 继续或不继续请求,但是当请求来自表单时我遇到了问题。

假设我有一个带有操作和提交按钮的 HTML 表单,然后过滤器评估请求,如果请求无效我需要停止请求:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    String requestDestination = ((HttpServletRequest) servletRequest).getRequestURI();
    if ( requestDestination.contains("/url") ) {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        Cookie denied = new Cookie("denied", "url");
        httpResponse.addCookie(denied);
        return;
    }
}

问题是,尽管执行了此操作,浏览器仍会转到此 URL 并显示一个空白页面,但我需要的是停止此默认行为,让用户留在同一页面中。

我无法使用 Java脚本,因为我不知道是谁触发了请求。

您不能"stop"请求。浏览器提交表单后,它将等待响应并呈现该响应正文的内容。

因此,如果您的 servlet 过滤器阻止了请求,您的过滤器也有责任return 向浏览器提供适当的内容。这通常是某种类型的错误页面,其内容完全由您决定。

不可能在服务器端执行 -- 因为无论服务器响应是什么(并且总是有响应,即使对于已停止的请求),您的浏览器也会显示它。就像您示例中的空响应一样。

在没有 JavaScript 的情况下,您唯一可以尝试实现的是向用户显示他来自的同一页面:

  • 你可以只显示他来自的同一个页面(带表格等)
  • 您可以使用 httpResponse.sendRedirect(httpRequest.getRequestURI())
  • 将用户重定向到同一页面

如果你想让用户 return 回到上一页,你可以尝试将用户重定向到从 Referer header 获取的 url:

if ( requestDestination.contains("/url") ) {
    String referer = request.getHeader("Referer");
    if (referer != null && referer.length() > 0) {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        httpResponse.sendRedirect(httpResponse.encodeRedirectURL(referer));
    } else {
        // just do nothing and display a blank page if there is no Referer
    }
}

但要使其正常工作,您需要确保 'previous page' 始终使用 GET 方法接受此类重复请求。