Java servlet:如何在重定向时删除 header "referer"?
Java servlet: How to remove header "referer" on redirect?
在 java servlet 上执行重定向时,是否可以删除 header Referer?
有点
response.setHeader("Referer", null);
response.sendRedirect(url)
我也试过过滤器。它甚至不会在响应时调用 setHeader 或 addHeader 方法。看起来我无法更改现有过滤器。找到这样的文章 http://sandeepmore.com/blog/2010/06/12/modifying-http-headers-using-java/
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class HeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(new HeaderHttpRequestWrapper(request), new HeaderHttpResponsetWrapper(response));
}
private static class HeaderHttpRequestWrapper extends HttpServletRequestWrapper {
public HeaderHttpRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getHeader(String name) {
if ("Referer".equalsIgnoreCase(name))
return "";
return super.getHeader(name);
}
}
private static class HeaderHttpResponsetWrapper extends HttpServletResponseWrapper {
public HeaderHttpResponsetWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void sendRedirect(String location) throws IOException {
// TODO Auto-generated method stub
super.sendRedirect(location);
}
@Override
public void addHeader(String name, String value) {
if ("Referer".equalsIgnoreCase(name))
return;
super.addHeader(name, value);
}
@Override
public void setHeader(String name, String value) {
if ("Referer".equalsIgnoreCase(name))
return;
super.setHeader(name, value);
}
}
}
您无法通过标准 Servlet API 删除响应 header。您可以通过创建一个过滤器来防止 header 被设置,该过滤器使用自定义 HttpServletResponseWrapper 实现替换 ServletResponse,只要 header 名称为 Content-Disposition,该实现就会跳过 setHeader() 的工作。
这是类似的问题:
How do delete a HTTP response header?
似乎无法删除 header
根本没有在响应中设置 referer
header。它是根据 请求 设置的。通过重定向,您基本上是在指示客户端自行创建一个全新的请求。该请求是在客户端而不是服务器端创建的。
真正的技术问题是您根本无法从服务器端更改请求 header。但是,响应 headers 肯定可以在服务器端进行修改,因为实际上是服务器本身创建了它们。
最接近的选择是重定向到一个代理,该代理恰好是您自己的或您可以完全控制的代理,然后让代理依次剥离请求 header。或者,让 servlet 本身充当代理。
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<script>window.location.href='" + url + "';</script>");
out.close();
由于Referer
是浏览器添加的,可以使用js
重定向。
在 java servlet 上执行重定向时,是否可以删除 header Referer? 有点
response.setHeader("Referer", null);
response.sendRedirect(url)
我也试过过滤器。它甚至不会在响应时调用 setHeader 或 addHeader 方法。看起来我无法更改现有过滤器。找到这样的文章 http://sandeepmore.com/blog/2010/06/12/modifying-http-headers-using-java/
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import java.util.Map.Entry;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class HeaderFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(new HeaderHttpRequestWrapper(request), new HeaderHttpResponsetWrapper(response));
}
private static class HeaderHttpRequestWrapper extends HttpServletRequestWrapper {
public HeaderHttpRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getHeader(String name) {
if ("Referer".equalsIgnoreCase(name))
return "";
return super.getHeader(name);
}
}
private static class HeaderHttpResponsetWrapper extends HttpServletResponseWrapper {
public HeaderHttpResponsetWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void sendRedirect(String location) throws IOException {
// TODO Auto-generated method stub
super.sendRedirect(location);
}
@Override
public void addHeader(String name, String value) {
if ("Referer".equalsIgnoreCase(name))
return;
super.addHeader(name, value);
}
@Override
public void setHeader(String name, String value) {
if ("Referer".equalsIgnoreCase(name))
return;
super.setHeader(name, value);
}
}
}
您无法通过标准 Servlet API 删除响应 header。您可以通过创建一个过滤器来防止 header 被设置,该过滤器使用自定义 HttpServletResponseWrapper 实现替换 ServletResponse,只要 header 名称为 Content-Disposition,该实现就会跳过 setHeader() 的工作。 这是类似的问题: How do delete a HTTP response header?
似乎无法删除 header
根本没有在响应中设置 referer
header。它是根据 请求 设置的。通过重定向,您基本上是在指示客户端自行创建一个全新的请求。该请求是在客户端而不是服务器端创建的。
真正的技术问题是您根本无法从服务器端更改请求 header。但是,响应 headers 肯定可以在服务器端进行修改,因为实际上是服务器本身创建了它们。
最接近的选择是重定向到一个代理,该代理恰好是您自己的或您可以完全控制的代理,然后让代理依次剥离请求 header。或者,让 servlet 本身充当代理。
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<script>window.location.href='" + url + "';</script>");
out.close();
由于Referer
是浏览器添加的,可以使用js
重定向。