简体   繁体   English

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

[英]Java servlet: How to remove header "referer" on redirect?

Is it possible remove header Referer when you execute redirect on java servlet?在java servlet上执行重定向时是否可以删除标头Referer? kind of的种类

response.setHeader("Referer", null);
response.sendRedirect(url)

Also I tried filter.我也试过过滤。 It even doesnt call setHeader or addHeader methods on response.它甚至不会在响应时调用 setHeader 或 addHeader 方法。 It looks like i cannot change existing filters.看起来我无法更改现有过滤器。 Found such article http://sandeepmore.com/blog/2010/06/12/modifying-http-headers-using-java/发现这样的文章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);
    }

}

} }

The referer header is not set on the response at all.根本没有在响应中设置referer标头。 It's set on the request .它是根据请求设置的。 With a redirect you're basically instructing the client to create a brand new request all on its own.通过重定向,您基本上是在指示客户端自己创建一个全新的请求。 That request is created on the client side, not on the server side.该请求是在客户端创建的,而不是在服务器端。

The real technical problem is that you can't change the request headers from the server side at all.真正的技术问题是您根本无法从服务器端更改请求标头。 Response headers, however, are surely modifiable in server side as it's actually the server itself who creates them.然而,响应头肯定可以在服务器端修改,因为实际上是服务器本身创建了它们。

Your closest bet is to redirect to a proxy, which happens to be your own or the one you have full control over, and let the proxy in turn strip the request header.您最接近的选择是重定向到一个代理,该代理恰好是您自己的或您可以完全控制的代理,然后让代理依次剥离请求标头。 Or, just let the servlet itself act as proxy.或者,让 servlet 本身充当代理。

You can't delete response headers by the standard Servlet API.您无法通过标准 Servlet API 删除响应标头。 Your can prevent the header from being set by creating a Filter which replaces the ServletResponse with a custom HttpServletResponseWrapper implementation which skips the setHeader()'s job whenever the header name is Content-Disposition.您可以通过创建一个过滤器来防止设置标头,该过滤器将 ServletResponse 替换为自定义的 HttpServletResponseWrapper 实现,只要标头名称为 Content-Disposition,就会跳过 setHeader() 的作业。 here is the similar question: How do delete a HTTP response header?这是类似的问题: 如何删除 HTTP 响应标头?

似乎无法删除标题

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

Since Referer is added by the browser, you can use js redirect.由于Referer是浏览器添加的,所以可以使用js重定向。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM