2015-11-02 598 views
3

当你在java servlet上执行重定向时,是否可以删除头Referer? 那种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); 
    } 

} 

}

回答

0

referer头不响应设置的。它设置在请求。通过重定向,您基本上可以指导客户自行创建全新的请求。该请求是在客户端创建的,而不是在服务器端创建的。

真正的技术问题是您根本无法从服务器端更改请求标头。然而,响应头在服务器端肯定是可以修改的,因为它实际上是创建它们的服务器本身。

你最接近的选择是重定向到一个代理,而这恰好是你自己或者你有完全控制权的人,并让又将代理剥离请求头。或者,让servlet本身充当代理。

+0

thx,我会说这是正确的答案 – Diyko

0

您无法通过标准的Servlet API的删除响应头。您可以通过创建一个过滤器来设置头部,该过滤器使用自定义的HttpServletResponseWrapper实现替换ServletResponse,该实现在头部名称为Content-Disposition时跳过setHeader()的作业。 这里是类似的问题: How do delete a HTTP response header?

+1

我不工作。我试过了。看到帖子更新 – Diyko

0

看来这是不可能去除头