我编写了一个过滤器,用于向Response对象添加一些报头值。
doFilter正在设置一些报头值,如下所示
public void doFilter(final ServletRequest req, final ServletResponse res, final FilterChain filterChain)
throws IOException, ServletException
{
final HttpServletResponse response = (HttpServletResponse) res;
final HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("X-FRAME-OPTIONS", "SAMEORIGIN");
filterChain.doFilter(req, res);
}
过滤器映射为"/*"
我有index.jsp页面作为欢迎页面,这是我的应用程序中唯一的页面。我正在尝试读取上面方法中设置的头值。
我的index.jsp是
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@page import="java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello world</title>
</head>
<body>
<%
out.println("<br/><br/>XFRAME"+request.getHeader("X-FRAME-OPTIONS"));
%>
<br/>
</body>
</html>
我在页面中得到Null输出。如果值设置为"SAMEORIGIN",我无法获得空值。
XFRAMEnull
这很简单,您已经在HttpServletResponse
标头中添加了一个属性,并期望从HttpServletRequest
标头中读取它。这是行不通的。
你需要理解的是HTTP协议。HttpServletRequest
是来自客户端到服务器端的请求,而HttpServletResponse
是来自服务器的数据和流的响应,并被转换回客户端消息(由浏览器呈现)。
来自请求/响应的每个报头都有必要的信息,以便服务器知道它接收到什么,如何转换接收到的数据以及返回什么响应。这就是为什么HttpServletRequest.getHeaders()
几乎永远不会与HttpServletResponse.getHeaders()
相同,因为每个请求/响应都符合HTTP请求/响应协议。
此外,您永远不能期望填充响应并神奇地出现在请求中。