1

我已经配置了一个过滤器来禁用我的浏览器后退按钮并将用户显示为会话已过期。当我在我的应用程序原型中配置它时,它按预期工作,但是当我将它合并到我的(spring MVC)应用程序时它不起作用。

我已经像这样配置了我的过滤器

<filter>
    <filter-name>backButtonFilter</filter-name>
    <filter-class>
        com.filters.BackButtonFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>backButtonFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我有这样的过滤器内容

response.setHeader("cache-control", "no-cache, no-store, must-revalidate");
response.setHeader("pragma", "no-cache");
response.setDateHeader("expires", 0);
response.setHeader("Cache-Type", "private");

我已经引入了日志语句来查看我的过滤器是否正在执行。我可以看到它正在执行。

为什么会这样?

4

2 回答 2

2

我可以建议使用Firebug来检查浏览器端的 HTTP 标头吗?这应该可以更容易地看出它们为什么没有按预期工作。

编辑需要注意的一件事是,确保所有 HTTP 标头都在 HTTP 正文之前被写出。

于 2009-12-08T10:04:55.727 回答
0

尝试在 Servlet 上下文中配置一个拦截器,如下所示:

<!--  configuration for handling browser back button  -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**/*"/>
        <beans:bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
            <beans:property name="cacheSeconds" value="0"/>
            <beans:property name="useExpiresHeader" value="true"/>
            <beans:property name="useCacheControlHeader" value="true"/>
            <beans:property name="useCacheControlNoStore" value="true"/>
        </beans:bean>
    </mvc:interceptor>
</mvc:interceptors>

但是无论会话是否实时,都应该在您的视图(HTML 或 JSP)中进行验证或处理。您可以在视图中使用以下元标记来表示 no-cache 和 no-store

<meta http-equiv="Cache-control" content="no-cache">

或者

<META HTTP-EQUIV="Cache-Control" CONTENT="No-Cache,Must-Revalidate,No-Store">

如果您使用 GET 提交表单,用户总是可以通过点击后退按钮进入结果屏幕。

如果您使用 POST,浏览器会说这可能是不可能的。

于 2015-12-07T13:20:21.287 回答