JSP响应头无法通过EL或JSTL输出,求无脚本解决方案
解决JSP中无法用EL/JSTL获取拦截器设置的响应头问题
这问题我之前踩过坑,核心误区是你搞混了EL里的header对象到底指的是什么!
为什么当前方法不行?
- EL的
${header}对应的是浏览器发送过来的HTTP请求头,不是你在服务器端通过response.setHeader()设置的响应头。所以不管你用${header['arg1']}还是${response.header['arg1']}都拿不到——前者找的是请求头,后者里的response在EL默认作用域里根本不存在,自然访问不到它的header属性。 - 而脚本
<%=response.getHeader("arg1")%>能正常工作,是因为它直接调用了当前线程中的HttpServletResponse对象方法,直接读取你刚设置的响应头值。
无需脚本的两种实现方法
方法一:同时存入Request属性(最简单推荐)
既然EL可以直接访问request作用域的属性,那我们在拦截器里设置响应头的同时,把同一个值存入request属性即可:
// 拦截器代码示例 response.setHeader("arg1", "test value"); request.setAttribute("arg1", "test value"); // 新增这一行,把值同步到request作用域
之后在JSP页面直接用EL输出:
${arg1}
或者明确指定作用域(更清晰):
${requestScope.arg1}
这个方法零额外配置,适合大多数场景。
方法二:自定义EL函数(适合频繁获取响应头的场景)
如果你的项目需要多次在页面中读取响应头,可以自定义一个EL函数来实现:
- 编写工具类,提供获取响应头的静态方法:
package com.yourproject.utils; import javax.servlet.http.HttpServletResponse; public class ResponseHeaderHelper { public static String getResponseHeader(HttpServletResponse response, String headerName) { return response.getHeader(headerName); } }
- 在WEB-INF目录下创建自定义标签库文件(比如
custom-functions.tld):
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>custom</short-name> <uri>http://yourdomain.com/custom-tags</uri> <function> <name>getResponseHeader</name> <function-class>com.yourproject.utils.ResponseHeaderHelper</function-class> <function-signature>java.lang.String getResponseHeader(javax.servlet.http.HttpServletResponse, java.lang.String)</function-signature> </function> </taglib>
- 在JSP页面顶部引入标签库:
<%@ taglib prefix="custom" uri="http://yourdomain.com/custom-tags" %>
- 使用EL函数读取响应头:
${custom:getResponseHeader(pageContext.response, 'arg1')}
内容的提问来源于stack exchange,提问作者Shakthi
相关产品推荐
相关产品推荐

