在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?

2024-01-25

我想将 cookie 添加到HttpServletResponse其内容(通常是 HTML)呈现后。

正如这里提到的(http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html), 和这里 (刷新标头后,在 Java 中向响应添加 cookie? https://stackoverflow.com/questions/2158548/adding-a-cookie-to-the-response-in-java-after-the-header-has-been-flushed),这可以通过缓冲响应来实现,这样它就不会被刷新并发送到客户端(因为在标头发送到客户端之后,响应被提交,并且不再有标头,即 cookie 标头,可以发送到客户端)。

假设这是当前的目标:我认为实现这一目标的一种可能方法是使用HttpServletResponseWrapper,我可以覆盖它的flushBuffer()方法并阻止实际将 headers\content 刷新到客户端:

public class BufferedHttpServletResponse extends HttpServletResponseWrapper {

    public BufferedHttpServletResponse(HttpServletResponse response) {
        super(response);
    }

    public void flushBuffer() {
    }

}

并将此缓冲响应应用于Filter,供过滤器链的其余部分使用:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(response);

    chain.doFilter(request, bufferedResponse);

    // ... create Cookie and add it to response ... response.addCookie(newCookie)
    // response.flushBuffer() ?        

}

问:上面的情况还可以吗,还是完全关闭了?响应的缓冲区是否会一直被内容\标题填充(并且可能会重新调整大小),直到我的doFilter()退出,然后由其他过滤器或 servlet 容器(Tomcat)刷新并发送到客户端?我应该自己刷新响应吗? ...这里提到(应该在 HttpServletResponse.getOutputStream()/.getWriter() 上调用 .close() 吗? https://stackoverflow.com/questions/1159168/should-one-call-close-on-httpservletresponse-getoutputstream-getwriter)该流不应关闭,但在这种情况下是否应该刷新响应?

不一定假设这是当前的目标:我的一般问题是,我需要为客户端浏览器设置一个 cookie,但 cookie 的值取决于渲染响应内容时发生的事情(发生在 Struts 1.0 Action 中的事情,之后在 Velocity 模板中发生的事情) - 只有在完成整个(Servlet -> HTML 渲染)流程之后,我才知道要设置什么 cookie 值。

请赐教。谢谢。


看起来没有人准备好接受这个,我将尝试至少提供我的观点。

在回答您的问题之前,首先让我们看一下 servlet 过滤器的主要任务。

  • 查询请求并采取相应行动。
  • 阻止请求和响应对进一步传递。
  • 修改请求头和数据。您可以通过提供 请求的定制版本。
  • 修改响应头和数据。您可以通过提供 响应的定制版本。

Source: http://docs.oracle.com/javaee/6/tutorial/doc/bnagb.html http://docs.oracle.com/javaee/6/tutorial/doc/bnagb.html

现在回到您的问题,您可以通过自定义响应(又名)来修改响应标头ResponseWrapper.

查看您的代码,您想要做的是修改原始响应而不是修改自定义响应(将 cookie 添加到原始响应)not OK.

因此,正确的方法是在您的自定义中添加 cookie,如下例所示。

   private class CustomResponseWrapper extends HttpServletResponseWrapper {

        private Collection<Cookie> myCookies = new ArrayList<Cookie>();

        public CustomResponseWrapper(HttpServletResponse response) {
            super(response);
        }

        @Override
        public void addCookie(Cookie cookie) {
            super.addCookie(cookie);
            myCookies.add(cookie);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新? 的相关文章

  • Java Servlet 中限制 HTTP 请求

    在 java servlet 中 如何根据客户端的 IP 地址限制来自用户的 http 请求 我不想每秒处理来自特定源 IP 地址的超过 X 个请求 其中 X 是可配置的并且具有 0 1 中的实际值 10 范围 从 10 秒内 1 个请求到
  • 使用 XMLHTTPRequest (TVMLJS) 发送 cookie

    我正在为我的 AppleTV 开发一个应用程序 该应用程序将从尚未开发任何 API 的在线网站读取电影 我使用 XMLHTTPRequest 来获取不同的 URL 并让用户搜索他的电影等 除了单个请求之外 一切都工作正常 要获取电影 URL
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • 如何在没有脚本 (PHP) 或服务器配置 (Nginx) 的情况下检测移动设备(和/或移动 cookie)?

    我们很快就会推出网站的移动版本 我们的完整网站和移动网站仅在主题上有所不同 即网址相同 唯一的区别在于前端 当用户访问我们的网站时 我们需要能够执行以下操作 1 检查 cookie 移动 true 或 false 以确定是否已定义完整与移动
  • Web 服务器和 servlet 容器之间的区别

    Web 服务器 和 Servlet 容器 有什么区别 一般来说 所有 Web 服务器也是 Servlet Web 容器 反之亦然吗 我一直在使用 Apache Tomcat for JSP 和 Apache for PHP 但无法弄清楚这两
  • 如何映射“根”Servlet 以便其他脚本仍然可以运行?

    我正在尝试构建一个调用 JSP 页面的 Servlet 类似于以下内容 public void doGet HttpServletRequest req HttpServletResponse resp throws IOException
  • 使用 WatiN 获取设置的 cookie 列表

    有没有办法使用 WatiN 获取网站设置的所有 cookie 列表 WatiN 中的 IE 浏览器类提供了GetCookie方法允许您检索特定的 cookie 但我想迭代所有已设置的 cookie 有两种方法可以让您获取 cookie Co
  • gwt rpc 中的会话 ID cookie

    假设我正在滚动自己的会话代码 那么在 java 中生成唯一且安全的会话 id cookie 的正确方法是什么 我不应该自己推出而是使用已经标准化的东西吗 我正在使用 gwt 和 google app engine 平台 如何使会话在浏览器
  • HttpServletResponse sendRedirect 永久

    这将重定向一个请求暂时的302 HTTP 状态代码 HttpServletResponse response response sendRedirect http somewhere 但是是否可以用 a 来重定向它永恒的301 HTTP 状
  • 如何设置 php cookie 的过期时间以及如果 cookie 存在如何将用户重定向到另一个页面 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望当用户来到我的页面时index php 它应该创建一个带有过期时间的 cookie 如果用户在 5 分钟内再次尝试访问该页面 他应该
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • ServletContext 是每个 Web 应用程序一个还是每个 JVM 一个?

    这是我提出的一个疑问 ServletContext 是每个 Web 应用程序一个 每个 JVM 一个 但是如果我在同一个 JVM 上运行多个 Web 应用程序 然后每个 JVM 有 2 个 ServletContext 是否可以 有人可以详
  • Grails 项目 - Servlet 调用 - ClassNotFoundException:javax.servlet.AsyncContext

    我在用 IntelliJ IDEA 终极版 12 4 grails 2 2 0 BuildConfig groovy 文件中的 grails servlet version 2 5 并实现了简单的 servlet post 请求 使用 RE
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • iOS 中如何清除特定域的 cookie?

    我已经搜索了 StackOverflow 上的几乎所有问题来寻找我的问题的答案 我还没有找到任何有用的链接或教程来说明哪种方式最好清除特定域的 cookie 如果有人可以帮助我 请 我自己找到了解决方案 如果您想删除 UIWebView 中
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • 如何在 Struts 2 应用程序中读取文本文件 [重复]

    这个问题在这里已经有答案了 开发 Struts 2 应用程序时遇到以下问题 我需要读取使用我的应用程序部署在 Web 服务器中的文本文件 我怎样才能知道它的相对路径来访问它 换句话说 如果我知道部署目录内的相对路径 如何找到绝对路径 当我在
  • Yii2 - 错误请求 (#400) |前端和后端cookie

    仅当我打开时才会出现此问题frontend and backend在相同的browser 设想 与后端交互 gt 切换选项卡 gt 与前端交互 gt 切换选项卡返回 gt 与后端交互 gt 错误请求 400 Cookie 后端 identi
  • Jetty - 找不到 Servlet

    我是 Servlet 新手 想通过使用 Eclipse 的 Jetty 插件来调用一个简单的 Servlet 我可以调用 index html 但是当尝试访问 Servlet 时 我得到 HTTP 错误 404访问 ProjectServl
  • Django-多个端口上的会话 cookie 和站点

    我有多个 Django 项目在一台服务器上运行 使用gunicorn http gunicorn org and nginx http wiki nginx org 目前 它们都被配置为使用 nginx 中的服务器指令在同一 IP 地址的唯

随机推荐

  • Haml - 非法嵌套:纯文本中的嵌套是非法的

    我在使用 HAML 时遇到代码中的奇怪错误 其中我的代码在本地计算机上运行 但当我部署它时 出现以下错误 ActionView Template Error 非法嵌套 在纯文本中嵌套是非法的 我的代码看起来像这样 td style gt w
  • 使用日期的 For 循环编译错误:语法错误

    我正在尝试运行一个脚本 该脚本将浏览特定列的所有行 然后它将这些列中的日期与设定的日期进行比较 如果日期大于则删除该行 我收到的错误称为编译错误 语法错误 Sub removewrongyear Dim i As Integer For i
  • 预编译头文件和普通包含文件

    使用预编译头时 当我在常规头中包含一个已经包含在预编译头中的头时 是否会产生影响 或产生不良影响 或者换句话说 当我在另一个头文件中包含头 x 并同时在我的预编译头文件中包含 x 时 这是否会阻止预编译头提供的优化发挥作用 No 一般来说
  • 如何正确应用RGBA_8888和抖动?

    我有带有渐变的splash png 但在屏幕上这个图像看起来不太好 我的简单 apk这个问题包括 public class TestditherActivity extends Activity Override public void o
  • 替换文本文件中的一行

    我有一个文本文件 被另一个应用程序用作配置文件 我已将文件的每一行读入字符串数组 string arrLine File ReadAllLines pathToFile 这正是我需要的 现在 我需要做的就是用字符串替换 arrLine x
  • 如何从角度材料日期选择器获取当前时间?

    我正在使用角度材料日期选择器https material angular io components select overview https material angular io components select overview
  • 在CMake项目下编译单个文件?

    我正在开发一个 C 项目 该项目将包含在一个更大的项目中 我已经看到 在更大的项目 是一个 Qt 应用程序 它是从 qmake 生成的 上 我可以从 linux 命令行编译单个文件 只需输入特定文件的相对路径作为 make 的参数 另一方面
  • 尝试将实体编码为 json 时出现问题

    我尝试将 Doctrine 实体编码为 JSON 字符串 以作为 Ajax 响应发送 所以 我检查了文档 串行器组件 http symfony com doc current components serializer html 我尝试使用
  • Vue.js 空过滤结果

    在 Vue 中 我必须过滤一些数据
  • Swift3随机扩展方法

    我使用这个扩展方法来生成随机数 func Rand range Range
  • 从使用 atexit() 注册的函数内部获取退出状态

    在我的里面atexit 注册函数我想获得退出状态 参数exit 3 或者 main 返回了什么 有没有任何便携式方法可以做到这一点 是否有任何 GNU libc 特定的方法可以做到这一点 例如我可以引用的全局持有该值 这是一个技巧 hack
  • 如何将图片上传到另一台服务器?

    我想创建一个提供 html 内容的应用程序服务器 其中包含由不同域上的另一台服务器提供的静态图像的链接 图片由用户通过应用服务器上传 我将执行以下操作将 JPEG 文件上传到应用程序服务器 if file exists folder nam
  • TFS 构建失败,但 Visual Studio 可以工作

    我做了一个新的构建定义 大多数选项保留默认值 我暂时只是玩玩而已 问题是 当我在 Visual Studio 2013 中以发布模式构建项目时 一切都很好 没有错误 当 TFS 构建它时 我遇到了一些错误 我必须将其从我自己的语言翻译成英语
  • 如何在滚动视图中调整图像视图的大小,就像在此图像中完成的那样?

    我创建了一个滚动视图 并在其中放置了一个图像视图 我希望滚动它以与下图中相同的方式调整大小 但到目前为止我还没有取得什么成功 在我的尝试中 图像在滚动时调整了大小 但是调整大小后仍有剩余空间 您将如何修改以下内容 Image 到目前为止我的
  • JS 中的 Excel PMT 函数

    我在互联网上找到了一个关于 PMT 计算的小片段 function PMT i n p return i p Math pow 1 i n 1 Math pow 1 i n function CalculatePMTFromForm idL
  • 如何在多个显示器上最大化窗口?

    使用 AutoHotkey 如何绑定热键以在多个显示器上拉伸 最大化 跨越窗口 以便它覆盖两个显示器 现在 我必须通过用鼠标手动拉伸窗口来完成此操作 我知道有专用工具可以执行此操作 但我已经在运行 AutoHotkey 脚本 并且宁愿限制我
  • SOQL python 中的通配符

    我正在尝试使用 simple salesforce 包使用 python 从 salesforce 进行查询 当我使用通配符时 它会抛出故障错误 soql SELECT FROM Contact where LastModifiedDate
  • Protractor 的 waitForAngular() 在 angular-webapp 上失败(真实设备上的 appium/chrome)

    我 新 使用量角器来运行 e2e 黄瓜测试 我有一个基于 angularJS 的网络应用程序 我正在使用 appium 在真实的 Android 设备上远程运行测试 这是我正在使用的版本 windows8 1 email protected
  • SBT:评估任务顺序

    我正在尝试获取有关 sbt 项目中所有模块的信息 有以下代码 lazy val getModule taskKey Module get single module info lazy val allModules taskKey Seq
  • 在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?

    我想将 cookie 添加到HttpServletResponse其内容 通常是 HTML 呈现后 正如这里提到的 http osdir com ml java jasig uportal 2005 10 msg00276 html htt