3

我有一张付款表格。当用户提交表单时,支付过程成功运行,但单击后退按钮会将用户带到相同的表单。我想在成功提交后使表单过期,以防止用户多次付款(以防用户返回并提交表单)。在阻止用户返回教程之后,我添加了过滤器,但它对我不起作用。我究竟做错了什么?这是我为过滤添加的内容。

<filter>
    <filter-name>paymentFilter</filter-name>
    <filter-class>path to PaymentFilter class</filter-class>
</filter>
<filter-mapping>
    <filter-name>paymentFilter</filter-name>
    <url-pattern>/order/*/payment</url-pattern>
</filter-mapping>

我的过滤器类是

public class PaymentFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub          
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        httpServletResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        httpServletResponse.setDateHeader("Expires", 0); // Proxies.
        System.out.println("In filter");            
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub          
    }

}

我添加了一个System.out.println("In filter"),但运行页面后在控制台上看不到它的输出(“在过滤器中”)。

当我使用 URL 模式作为控制台上/*的打印时,System.out

<url-pattern>/*</url-pattern> (it works as expected)

但是当我将 URL 模式更改为/order/*/payment(* 是订单 ID 时,每个订单会发生什么变化)。然后System.out不在控制台上打印任何内容。

<url-pattern>/order/*/payment</url-pattern> (it doesn't work)

我正在使用spring mvc、apache、tomcat7.0

4

4 回答 4

2

正如您已经发现的那样, * 只能是 url 模式的前缀或后缀。这样做的原因是,如果以其他方式定义,则会出现很多歧义。

此外,如果您使用 GET 提交表单,用户总是可以通过点击后退按钮进入结果屏幕。如果您使用 POST,浏览器会说这可能是不可能的。

于 2012-12-11T17:20:25.937 回答
2

对于您的问题,我有一个替代解决方案。您可以尝试使用 javascript 或 jquery 来禁用后退或前进按钮。

于 2012-12-11T18:20:17.760 回答
1

尝试添加

chain.doFilter(request, response);  

作为 doFilter 方法的最后一行。

于 2012-11-24T18:45:19.860 回答
1

是什么给了我解决问题的方法是我“不能”在我的 url-patter 中使用用户正则表达式进行过滤器映射。* 只能用作后缀或前缀。

于 2012-12-05T07:38:59.900 回答