Java servlet:如何在重定向时删除“referer”标头?

4
当你在Java Servlet上执行重定向时,是否可能删除头部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);
    }

}

}

4个回答

1
“referer”头在响应中根本没有设置,它是在请求中设置的。通过重定向,您基本上指示客户端自己创建全新的请求。该请求是在客户端上创建的,而不是在服务器端上创建的。
真正的技术问题是您无法从服务器端更改请求标头。然而,响应标头确实可以在服务器端进行修改,因为实际上是服务器本身创建了它们。
您最接近的选择是重定向到代理,该代理恰好是您自己或您完全控制的代理,并让代理依次剥离请求标头。或者,只需让servlet本身充当代理即可。

-1

似乎无法删除标题


-1
您无法通过标准Servlet API删除响应头。但是,您可以通过创建一个Filter来替换ServletResponse为自定义的HttpServletResponseWrapper实现,从而在标题名称为Content-Disposition时跳过setHeader()的作业,以防止设置标题。
这里有一个类似的问题:如何删除HTTP响应头?

-1
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<script>window.location.href='" + url + "';</script>");
out.close();

由于浏览器添加了Referer,您可以使用js重定向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接