2015-11-02 38 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

看來這是不可能去除頭