- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 ServletExec 将现有应用程序从 IIS 迁移到 tomcat。除了有一个带有两个 servlet 的 servlet 链的情况外,我的一切都正常工作。
第一个 servlet 做一些处理,第二个 servlet 做一些翻译。
request-->ProcessServlet--> (untranslated html) -->TranslateServlet --> response
在我的例子中,我可以调用 ProcessServlet,它会生成带有未翻译标签的 html。第二个 servlet 看起来像是获取 html、定位众所周知的翻译标签并翻译它们并为浏览器生成可读的输出。
从谷歌搜索,看起来不再支持/推荐使用 servlet 别名的 servlet 链接(from this page)并且可以使用过滤器实现相同的功能,但类必须实现一个接口(interface),但不幸的是,在我的情况下我必须工作与现有的类文件。
This page指定概念但没有示例。
同样来自 this page
How to Configure a Servlet Chain Using Servlet Aliasing
Using the Servlet Aliasing subsection of the setup section in the Administration Tool, a list of servlets can be named for a particular URL request. In the servlets table, when adding a new mapping, you are allowed to enter a comma-separated list of servlets in the order in which they should be invoked when a request arrives for that particular URL. This configures a servlet chain to be invoked every time a request that matches the URL arrives.
任何人都可以指定一个示例或为我指明正确的方向,以说明如何让这个链从 web.xml 开始工作吗?
更新:
根据 kschneid 在他的回答中的概述,这是对我有用的完整实现
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 {
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper processResponse = new MyHttpServletResponseWrapper(httpResponse);
chain.doFilter(request, processResponse );
String content = processResponse.toString();
config.getServletContext().log("CONTENT: " + content);
HttpServletRequest httpRequest = (HttpServletRequest) request;
MyHttpServletRequestWrapper processResponseAsRequest = new MyHttpServletRequestWrapper(httpRequest, content);
RequestDispatcher dispatch = request.getRequestDispatcher("/Translate");
response.setContentType("text/html");
dispatch.forward(processResponseAsRequest, response); // forward to translate servlet with response from process servlet as the request and the original response
}
}
class MyHttpServletResponseWrapper
extends HttpServletResponseWrapper {
private StringWriter sw = new StringWriter();
public MyHttpServletResponseWrapper(HttpServletResponse response) {
super(response);
}
public PrintWriter getWriter() throws IOException {
return new PrintWriter(sw);
}
public ServletOutputStream getOutputStream() throws IOException {
throw new UnsupportedOperationException();
}
public String toString() {
return sw.toString();
}
}
class MyHttpServletRequestWrapper
extends HttpServletRequestWrapper {
private String content;
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
public MyHttpServletRequestWrapper(HttpServletRequest request, String content) {
super(request);
this.content = content;
}
public ServletInputStream getInputStream()
{
return new MyServletInputStream(content);
}
public BufferedReader getReader()
{
InputStreamReader in= new InputStreamReader(getInputStream());
return new BufferedReader(in);
}
}
class MyServletInputStream extends ServletInputStream
{
private InputStream is;
public MyServletInputStream(String content)
{
is = new ByteArrayInputStream(content.getBytes());
}
public int read() throws IOException
{
return is.read();
}
}
最佳答案
我不太熟悉 servlet 链接的实现细节,但这里有一个可能有效的通用方法。将两个 servlet 映射到不同的 URL:
<servlet-mapping>
<servlet-name>process</servlet-name>
<url-pattern>/process</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>translate</servlet-name>
<url-pattern>/translate</url-pattern>
</servlet-mapping>
然后将过滤器映射到 process
servlet:
<filter-mapping>
<filter-name>processChain</filter-name>
<servlet-name>process</servlet-name>
</filter-mapping>
processChain
过滤器会执行如下操作:
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
ServletResponseWrapper processResponse = ...; // response buffer
chain.doFilter(request, processResponse); // let process servlet populate response buffer
ServletRequestWrapper processResponseAsRequest = ...; // use processResponse to create request for translate servlet
RequestDispatcher dispatch = request.getRequestDispatcher("/translate");
dispatch.forward(processResponseAsRequest, response); // forward to translate servlet with response from process servlet as the request and the original response
}
...或类似的东西 ;)
关于tomcat - 使用 servlet 别名的遗留 servlet 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974101/
我正在为一个站点构建 flexbox,而新版本非常棒——完全按预期工作。但是,因为我们使用 wkhtmltopdf 呈现为 PDF,所以看起来我们需要暂时支持遗留 (webkit-*) flexbox
我有一个遗留的 GDB 命令脚本,用于基于 Python 2.6 源代码附带的 GDB 脚本获取 Python 堆栈跟踪(所以不允许超链接,但这是 URL:http://#%20http ://svn
$ sudo apt-get 安装 nodejs-legacy阅读包裹 list ...完成构建依赖树 正在读取状态信息...完成E: 无法定位包 node-legacy 请提出解决方案... 最佳答
我最近有幸获准在中型遗留代码库(从 3.x 到 5.2)中更改 Hibernate 依赖项(以及其他)的版本。代码本身已有 10 多年的历史,但仍在日常使用中。 因此,即使在增加版本并将尽可能多的 A
我正在尝试在 Debian GNU/Linux 稳定系统上编译一些较旧的 C++ 代码(可能来自 2001-2002 年左右)。编译时出现错误: In file included from /usr/
为 unix 上的一些遗留 c/c++ 代码寻找代码分析工具专门用于识别对 的依赖 具体职能 特定(包括?)文件 文件/套接字 I/O 调用等 来自根等的函数依赖树 最佳答案 Doxygen 可能就是
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我必须从遗留的 Visual Basic 软件中复制一个算法,但有一点我不理解代码。 作者似乎使用了某种方式通过引用隐式传递整数等简单数据类型。第一次我认为它可能是原始软件中的错误,但第三次出现后它看
我需要以编程方式最小化和最大化全屏 16 位应用程序。不幸的是,DosBox 不是一个选项,因为这个应用程序与 DosBox 不支持的一些外围设备对话。 我能够编写可以设置焦点、发送 alt + en
我想拦截对遗留 Java servlet/JSP 应用程序的请求,并使用 OpenID Connect (OIDC) 协议(protocol)对用户进行身份验证。 我看过 Spring Securit
我有一个遗留的 tomcat Java 应用程序(Spring、Hibernate、MySQL) 在 Linux (Ubuntu) 上运行。我想(需要)利用现有应用程序的后端数据库构建一个 Andro
我刚刚更新了我们的应用程序以使用最新版本的遗留 NVP API,并发现提到了巴西显然需要的两个新字段(TAXIDTYPE、TAXID)。这些显然是在我们之前使用的 API 版本之后引入的。 我只是尝试
我正在使用 g++ 4.4.7 编译一段非常古老的遗留代码。关于这段代码,我真正知道的是它是在 Irix/Sun 系统上开发的,这意味着它具有 MIPS 体系结构。我在使用这段代码时发现的一件相当奇怪
我们正在考虑使用托管 C++ 为一些遗留 C++ 库编写 .Net 可调用包装器。 这一切看起来都很简单。有什么需要注意的吗? 最佳答案 我发现在 C++/CLI 中包装一些现有的 C++ 库通常很容
好的,我们有了这个庞大的裸机 php 项目,我们想慢慢将其转换为 Symfony3 这是一个不断变化和更新的项目,因此我们需要它是透明的,以确保不会干扰使用它的人。他们根本不应该注意到差异。 所以我们
我们有一个中型 Java 应用程序需要一些重构。 我们正在考虑迁移到 JRuby on Rails。主要是因为 Ruby on Rails 提供的生产力以及许多将重新实现 Web 逻辑的现有插件。 但
我的问题是关于经典 ASP,而不是 ASP.Net。我在这里询问专家,因为搜索引擎总是告诉我 ASP.Net 答案。我的困惑是, 如何在经典 ASP 代码中或通过配置设置 session 过期时间?
在十多年没有用 C++ 编程之后,我正在尝试向遗留的 C++ Win32 DLL 添加正确的错误报告。 这有力地提醒了我们在 C/C++ 中处理空终止字符串的令人难以置信的单调乏味——更不用说潜在的缓
我必须获得一些在 Windows 10 下运行的遗留 (XP) MFC 代码。它在 Windows 7 下运行良好。我没有尝试过任何其他版本。 想法是内存中有一个缓冲区,其中包含 RGB 格式的图像像
require('url').parse('someurl.com/page') 已仅在文档中被弃用,我们严格的 linter 对此感到不满...我尝试在我们的代码中将其替换为互联网建议的 new U
我是一名优秀的程序员,十分优秀!