2016-04-28 9 views
0

私は2台のサーバーを持っています。そのうちの1台はパブリックで、もう1台はユーザーから隠されています。最初はローカルネットワークの2番目のものを見ることができますが、ユーザーはパブリックネットワーク上の2番目のコンピュータにアクセスできません。Javaの隠されたURLにリダイレクト

一部のURL(特定のパターンを持つ)を公開コンピュータから隠しファイルにリダイレクトする必要があります。非表示のURLは、応答時にヘッダーを返す可能性があります。

現在のところ、この機能をリダイレクトストリームで実装していますが、問題はエンドユーザー/クライアントに対してすべてのヘッダーが含まれていないという問題です。

隠し応答:リダイレクトストリームの後

Accept-Ranges: bytes 
Connection: keep-alive 
Content-Disposition: filename="0.jpg" 
Content-Length: 38903 
Content-Range: bytes 0-38902/38903 
Content-Type: image/jpeg;charset=UTF-8 
Date: Thu, 28 Apr 2016 05:11:48 GMT 
Last-Modified: Mon, 25 Apr 2016 06:28:17 GMT 
Server: Apache-Coyote/1.1 

は応答:私はクライアントにすべてのヘッダーを持つことができますどのように

private void redirectGalleyStream(long diskId, String code, HttpServletResponse response) 
     throws IOException { 
    final InputStream is = new URL(Settings.i().getVodServer() + "/downloadGalleryImage" + 
      "?diskId=" + diskId + "&code=" + code).openStream(); 
    fastCopy(is, response.getOutputStream()); 
} 


public static void fastCopy(final InputStream src, final OutputStream dest) throws IOException { 
    try { 
     final ReadableByteChannel inputChannel = Channels.newChannel(src); 
     final WritableByteChannel outputChannel = Channels.newChannel(dest); 
     fastCopy(inputChannel, outputChannel); 
    } finally { 
     try { 
      src.close(); 
     } catch (Exception ignored) { 
     } 
     try { 
      dest.close(); 
     } catch (Exception ignored) { 
     } 
    } 
} 

public static void fastCopy(final ReadableByteChannel src, final WritableByteChannel dest) throws IOException { 
    try { 
     final ByteBuffer buffer = ByteBuffer.allocateDirect(16 * 1024); 

     while (src.read(buffer) != -1) { 
      buffer.flip(); 
      dest.write(buffer); 
      buffer.compact(); 
     } 

     buffer.flip(); 

     while (buffer.hasRemaining()) { 
      dest.write(buffer); 
     } 
    } finally { 
     try { 
      src.close(); 
     } catch (Exception ignored) { 
     } 
     try { 
      dest.close(); 
     } catch (Exception ignored) { 
     } 
    } 
} 

Connection: keep-alive 
Content-Length: 38903 
Date: Thu, 28 Apr 2016 05:14:06 GMT 
Server: Apache-Coyote/1.1 

私のコードは、この何かのリンクですか?

答えて

1

問題を解決しました。

公共の静的な無効FastCopyの(文字列のURL、HttpServletResponseの応答は、 HttpServletRequestのリクエスト)がIOExceptionがスロー{ URL OBJ =新しいURL(URL); URLConnection conn = obj.openConnection();

Enumeration<String> headers = request.getHeaderNames(); 
    while (headers.hasMoreElements()) { 
     final String headerName = headers.nextElement(); 
     conn.addRequestProperty(headerName, request.getHeader(headerName)); 
    } 

    // Cast to a HttpURLConnection 
    if (conn instanceof HttpURLConnection) { 
     HttpURLConnection httpConnection = (HttpURLConnection) conn; 
     int code = httpConnection.getResponseCode(); 

     if (code < 300) { 
      Map<String, List<String>> map = conn.getHeaderFields(); 
      for (Map.Entry<String, List<String>> entry : map.entrySet()) { 
       final String key = entry.getKey(); 
       if(Objects.equals(key, "Transfer-Encoding")) continue; 
       String value = String.valueOf(map.get(key)); 
       if (value != null && value.length() > 0) 
        value = value.substring(1, value.length() - 1); 
       response.setHeader(key, value); 
      } 
      fastCopy(conn.getInputStream(), response.getOutputStream()); 
     } 
     response.setStatus(code); 
    } else { 
     System.err.println("error - not a http request!"); 
    } 
}