gpt4 book ai didi

java - servlet 链过滤器

转载 作者:行者123 更新时间:2023-11-28 21:54:32 24 4
gpt4 key购买 nike

如何编写过滤器类以将响应从一个 servlet 连同 GET 参数传递到另一个?

这是我尝试过的内容的概要(我从 this question 中得到大部分内容)

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TranslateFilter implements Filter {

private FilterConfig config = null;

public void init(FilterConfig config) throws ServletException {
this.config = config;
}

public void destroy() {
config = null;
}

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

chain.doFilter(request, response);
..

RequestDispatcher dispatch = request.getRequestDispatcher("/Translate");
dispatch.forward(request, response);
..
}
}

这在 web.xml 中

<servlet-mapping>
<servlet-name>process</servlet-name>
<url-pattern>/Process
</servlet-mapping>

<servlet-mapping>
<servlet-name>translate</servlet-name>
<url-pattern>/Translate
</servlet-mapping>

<filter-mapping>
<filter-name>processChain</filter-name>
<servlet-name>process</servlet-name>
</filter-mapping>

但不是不行。它没有转发到第二个 servlet。我没有调试环境设置,所以我不知道哪里出了问题,但有人能给我指出正确的方向吗?

最佳答案

FilterChain#doFilter() 继续请求处理,并且仅在目标 Controller 完成其工作并且已呈现和提交响应时才返回。

如果您打算通过 RequestDispatcher#forward() 将请求更改为不同的服务器端目的地(或者当您想让客户端通过 HttpServletResponse#sendRedirect() 发送新请求)。通过在服务器日志中看到 IllegalStateException: response already committed,您应该已经注意到了这一点。

所以,要么删除它,这样你就只会得到前锋,

request.getRequestDispatcher("/Translate").forward(request, response); 

或者让它成为有条件的

if (someCondition) {
chain.doFilter(request, response);
} else {
request.getRequestDispatcher("/Translate").forward(request, response);
}

与具体问题无关,如果我正确理解/猜测您的实际功能需求,您更多的是在 中寻找 RequestDispatcher#include() >/进程 servlet。另见 How do I execute multiple servlets in sequence?

关于java - servlet 链过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com