【问题标题】:All jsp pages are getting refreshed if refresh parameter is set at the first jsp page如果在第一个 jsp 页面设置了刷新参数,则所有 jsp 页面都将被刷新
【发布时间】:2026-01-07 11:20:08
【问题描述】:

我正在尝试仅刷新起始页面(调用某些函数)说 “1.jsp” 并且一旦满足条件,它就会被重定向到另一个 jsp 页面,比如 “2.jsp”,但不知道为什么 2.jsp 也会被刷新。不仅如此,1.jsp中调用的函数也被调用了。下面是示例代码,仅供理解:

1.jsp

<body>
    <h1>Hello World!</h1>
    <% 
    // Here i am trying to read some txt file which is contantly being updated. (by refreshing the page)
    // when txt file is written completely, some character like "### DONE ###" will be present at its last line.
    // once "### DONE ###" is found , it will be redirected to "2.jsp"


    System.out.println("1");
    // if "###DONE###" found
    RequestDispatcher rd=request.getRequestDispatcher("2.jsp");
    rd.forward(request, response);            

    %>
</body>

2.jsp

<body>
    <h1>Hello World! PAGE 2</h1>
</body>

web.xml

<welcome-file-list>
    <welcome-file>1.jsp</welcome-file>
</welcome-file-list>

<filter>
    <filter-name>SampleFilter</filter-name>
    <filter-class>com.SampleFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SampleFilter</filter-name>
    <url-pattern>/2.jsp</url-pattern>
</filter-mapping>

** 采样过滤器**

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
    public void setHeader(String name, String value) {
        System.out.println(name+"-------------------------------");
        if (!name.equalsIgnoreCase("Refresh")) {
            System.out.println("inside");
            super.setHeader("Refresh", "2");
        }
    }
});
}

【问题讨论】:

  • 你必须写更多的信息
  • 编辑了我的代码。你能看看吗

标签: java javascript jquery jsp


【解决方案1】:

我的猜测是,当您执行rd.forward(request, response) 时,您实际上会转发response.addHeader("Refresh","2"),从而导致下一页也自动刷新。

我不确定为什么在转发之前确实需要刷新,但如果你必须拥有它 - 检查你是否可以删除特定的标题(“刷新”),也许使用这里提出的解决方案:How do delete a HTTP response header?

编辑:

此外,您应该考虑通过 HTML 标记来触发刷新,而不是通过标题等服务器端属性触发刷新:&lt;meta http-equiv="refresh" content="2" /&gt;

【讨论】:

  • 我已经根据我的理解编辑了我的代码。请您进一步指导我。这件事对我来说真的是小鬼。 :(
  • (1) 从 2.jsp 中删除 response.setHeader 部分。 (2) 将 url-pattern 更改为 "catch" 2.jsp 而不是 1.jsp (3) 在 SampleFilter.java 中,将 !name.equalsIgnoreCase("tt") 替换为 !name.equalsIgnoreCase("Refresh") -- -> 这应该告诉服务器在访问 2.jsp 时触发过滤器,并防止将“刷新”属性应用于此 2.jsp 页面。
  • 感谢您的快速回复。我再次编辑了我的代码。您建议的代码没有刷新“1.jsp”。我已经在abv代码中解释了刷新1.jsp的原因。请看一下
  • 我尝试为“1.jsp”创建另一个过滤器,它执行“super.setHeader("Refresh", "2");"。但仍然“2.jsp”正在刷新
  • 谢谢!!以上 HTMP-Tag 对我有用。将其添加到我的代码中,如果可行,将选择它作为答案:)
最近更新 更多