- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个过滤器,如果请求中涉及“转发”,则此代码将无法执行/response.write。但它对于简单地将 HTML 内容传送给用户的基本 servlet 来说效果很好。如何使用此代码解决“转发”问题。
例如,这里的过滤器简单地捕获文本内容并尝试操作该内容。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(false);
CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseWrapper);
final boolean commit1 = responseWrapper.isCommitted();
final boolean commit2 = response.isCommitted();
if (!commit2) {
final String res = responseWrapper.toString().replaceAll("(?i)</form>", "<input type=\"hidden\" name=\"superval\" value=\""+superval"\"/></form>");
response.getWriter().write(res);
}
return;
}
...这适用于大多数基本的 servlet,目标是与“replaceAll”一致。
现在,如果我创建一个带有“forward”的 servlet,代码将不起作用,它会在带有“if (!commit2)”的行处失败,因为流显然已经提交了?
例如,如果我向此 servlet 发出请求并将过滤器绑定(bind)到此 servlet,则过滤器不会完全执行。
public class TestCommitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("TestCommitServlet2").forward(req, resp);
}
@Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
这是我要转发到的 servlet:
public class TestCommitServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final PrintWriter out = resp.getWriter();
resp.setContentType("text/html");
out.println("<html><body>(v-1)testing<form action='test'><input type='submit' value='Run' /> </form></body></html>");
}
@Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Tl;dr :我是否必须进行此调用 'if (!commit2) {' 代码无需它即可工作。在此代码下,我将如何避免已提交的响应或 IllegalStateExceptions(与 response.getWriter().write(res); 相关的行)
有关此问题的更多信息:
最佳答案
我正在使用 Servlet API 3.0 来检查此场景。我发现的是以下内容。当我调用 TestCommitServlet2 时,使用您的 servlet 和过滤器代码,我可以看到以下输出。
http://localhost:8080/Question/TestCommitServlet2
(v-1)testing
Button here
com.koitoer.CharResponseWrapper@5b5b6746
当我调用 servlet TestCommitServlet 时,我能够看到以下内容。
http://localhost:8080/Question/TestCommitServlet
(v-1)testing
Button here
这表明过滤器根本不适用于此转发的请求。
所以,我记得一些过滤器可以在不同的 DispatcherTypes 中起作用,如 FORWARD、INCLUDE、ERROR、ASYNC 和 commong REQUEST,我决定将过滤器声明更改为。
@WebFilter(filterName = "/MyFilter", urlPatterns = { "/TestCommitServlet2" }, dispatcherTypes = {
DispatcherType.FORWARD, DispatcherType.REQUEST })
public class MyFilter implements Filter {
然后,当我通过 servlet TestCommitServlet 执行 GET 时,我得到:
(v-1)testing
Button
com.koitoer.CharResponseWrapper@1b3bea22
上面显示过滤器现在应用于转发请求。
此外,如果我删除或注释 if (!commit2) { 代码仍然有效,因此不会出现 IllegalStateException,因为请求需要传递调用 doChain 方法的过滤器。
请注意,如果您尝试使用此替换响应的内容。
responseWrapper.toString().replaceAll
你做错了,因为responseWrapper.toString()返回类似CharResponseWrapper@5b5b6746的东西,而不是内容,如果你想修改响应,使用从HttpServletResponseWrapper扩展的包装器并覆盖正确的方法来操作输出流。
关于java - J2EE : Understanding isCommitted and Filters under this scenario,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540010/
我有以下代码: String text = "[\"Scenario 1\", \"Scenario 2\"]" 我需要将 "text" 转换为 Array。我知道我可以替换 [ ] "并执行 spl
我知道 here 中的场景和场景大纲之间的区别。 Scenario states 以更抽象的方式测试的一般点。同时,scenario outline通过几个示例来帮助执行场景。 所以,我们通常会写fe
我在 Cucumber 中有我的特征文件,我正在使用 Given, When, Then 语法 (Gherkin) 在其中编写我的场景,并在步骤定义文件中有相应的步骤。我有一个场景,我正在检查特定数据
我正在尝试运行一些测试作为学习 cucumber 的一部分。但我得到的结果是 0 个场景。在这里,我添加了我编写的代码: 登录功能和- Feature: Application Login S S
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个像这样的 XML
我一直在尝试使用 Calabash 来测试一些简单的 iOS 应用程序。我能够在模拟器上运行该应用程序,并且所有步骤都运行良好。现在我想在 iOS 设备上测试它,但我遇到了一些问题。我用所有必要的信息
我有以下 MySQL 实例以及复制设置: S1 -----> (M1 M2),其中: M1 - M2 是一个多主复制设置, S1 - 复制在主 M1 上完成的写入的从站。 现在,我正在尝试使用 ch
我正在使用 Specflow 编写一套模拟月薪的场景,验证每个月的计算付款以及最后的年终数据。 每个月的结果都是累加的,所以后面的每一个场景都依赖于上个月的加减。支付计算通过第三方工具写入数据库,因此
有两个需要的功能:注册时设置密码和更改密码,如果用户忘记了。用户注册时,密码长度必须至少为4个字符;当更改通过时 - 至少 5 个字符。 View 对于注册和更改通行证很常见。显然,还存在 2 个操作
正如主题所述,我很难想象在现实生活中的示例中何时何地使用可恢复异常,以及我们可以通过使用它们获得哪些有效优势。 我能想象的是,一个子系统已连接,比方说通过 RFC 连接到一个 session ,该 s
我正在设计一个游戏,其中一个角色有很多元素,而这些元素可以有多种类型。有一个角色表,以及十二个按类型(例如武器、盔甲和各种其他项目类型)分割的可能项目的不同表。 我想制作一个表来保存这些项目类型的实例
我正在开发一个 Windows 8 Metro 风格的应用程序,在大学的学术项目中使用开发者预览版。我们必须使用 MVVM 模式。 在主页中,我们有一个带有按钮的 Metro 风格主菜单。根据 MVV
目前,我正在使用BDD进行项目,其中涉及一些导入语句,例如 导入 cucumber .api。场景; 但是我找不到合适的依赖项 目前我有依赖 compile 'commons-lang:commons
考虑以下因素: @Given("^this stuff:$") public void this_stuff(List stuffList) throws Throwable { stuffL
我正在寻找如何实现这个场景:我有函数内部的逻辑代码,现在我希望能够在单独的线程中执行此功能。现在我拥有的是这个 .. 的原始实现我简单地初始化线程,在它的启动/运行方法中我保留了函数逻辑。我怎样才能让
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我有一个相当流行的场景,其中有一个包含进度条和 ListView 的 fragment 。我想在使用 Retrofit 获取数据后填充 ListView。现在,一旦响应返回,就需要使进度条不可见。 存
回答问题前请引用以下程序。在评论中解释了代码。 所以我的问题是赋值运算符重载如何处理 new() 分配内存失败的情况。 例如 Obj1 持有字符串 "GeeksQuiz"。将 Obj2 分配给 Obj
在下面的代码中,我只是想看看我是否能够从每个线程将一个元素插入到数组中。它按预期工作。但后来我想知道,在什么情况下这里会出现竞争条件。我真的需要 volatile 还是信号量?我尝试删除信号量和 vo
我是一名优秀的程序员,十分优秀!