SiteMesh:更改响应的内容类型

2024-04-09

我试图说服 SiteMesh 装饰器更改响应的内容类型,但没有任何乐趣。内容类型最终总是与装饰后的 JSP 相同,而不是装饰器的内容类型。

例如,假设我有一个带有标头的 JSP

<%@ page contentType="application/xhtml+xml" %>

我还有一个 SiteMesh 装饰器 JSP,它定义了以下内容:

<%@ page contentType="application/vnd.wap.xhtml+xml" %>

我想要的是装饰响应具有装饰器的 mime 类型(这里使用的实际 MIME 类型并不重要,这只是为了说明问题)。

对 SiteMesh 2.4.1 源代码的挖掘表明问题在于ContentBufferingResponse类,负责捕获目标的输出。这会覆盖setContentType()方法,记录该值以供以后使用,但它也会调用super.setContentType(),有效地将目标 JSP 的内容类型直接传递给响应。一旦完成,再多的哄骗也无法说服回应者不这样做。

那么有解决方法吗?目标 JSP 的内容类型是否可以被抑制,并从装饰器中获取?


The ContentBufferingResponse.setContentType将触发对HttpServletResponseWrapper.setContentType。随后,使用以下方法将装饰器包含在响应中:RequestDispatcher.include它无法更改状态代码或设置标头(任何更改尝试都会被忽略)。所以基本上,一旦你设置了内容类型,游戏就结束了,你无法更改它。

据我观察,SiteMeshFilter.obtainContent方法是唯一的地方ContentBufferingResponse类被实例化,所以SiteMeshFilter and ContentBufferingResponse将是寻找解决方法的地方。

一种可能的解决方法是覆盖obtainContent在一个子类中SiteMeshFilter并使用多态性在运行时调用正确的方法。这只有一个问题:obtainContent被标记为私有,因此多态性不起作用。拨打另一个电话obtainContent方法,您将不得不在过滤器中覆盖比此方法更多的内容,恐怕其中将包括doFilter方法本身。

另一种解决方法是以某种方式调用另一个版本的setContentType方法,一种不调用的方法super.setContentType与装饰页面的 mime 类型。但是你不能改变对另一个方法的调用,因为obtainContent我们正在实例化的代码ContentBufferingResponse例如使用“新”。

此时您可以创建一个副本ContentBufferingResponse项目中的类(在同一包声明下),其中setContentType方法调用super.setContentType使用您想要的 mime 类型,而不是装饰页面中的 mime 类型。然后,您可以通过使用类路径并确保您的类在 SiteMesh jar 中的类之前加载,欺骗服务器加载您的类而不是原始类。这里的主要问题是如果你有多个装饰器(我确信你有:D),那么在不同的 mime 类型之间进行管理。

第三种(也是丑陋的)解决方法是直接破解 SiteMesh 的代码并自行解决(不确定是否会遇到许可证问题)。

因此,在我看来,除非您愿意采取一些丑陋的解决方法,否则一旦设置内容类型,您将无法更改内容类型。

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

SiteMesh:更改响应的内容类型 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐