当前位置: 代码迷 >> Web前端 >> http署理
  详细解决方案

http署理

热度:520   发布时间:2012-11-23 00:03:43.0
http代理

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*" %>
<%@ page language="java" import="java.net.URL" %>
<%@ page language="java" import="java.net.HttpURLConnection" %>
<%@ page language="java" import="java.nio.charset.Charset" %>
<%@ page language="java" import="java.io.*" %>
<%@ page language="java" import="javax.servlet.ServletOutputStream" %>
<%@ page language="java" import="java.awt.*" %>
<%@ page language="java" import="java.awt.image.BufferedImage" %>
<%@ page language="java" import="java.awt.image.*" %>
<%@ page language="java" import="java.awt.Color" %>
<%@ page language="java" import="javax.imageio.ImageIO" %>
<%@ page language="java" import="com.sun.image.codec.jpeg.*" %>
<%
	String targetUrl=request.getParameter("url");
	String method=request.getParameter("requestmethod");
	String content="";
	String proxyType = "text";//代理类型[文本代理text,图片代理img]
	//解码
	targetUrl = new String(targetUrl.getBytes("ISO-8859-1"),"UTF-8");
	StringBuffer temp=null;

	HttpURLConnection urlConnection = null;   
    request.setCharacterEncoding("utf-8");

    response.setContentType("text/html;charset=utf-8");
    String prjName=request.getContextPath();
    	//用于转发gb2312格式的串
    String proxygb2312="http://"+request.getLocalAddr()+":"+request.getLocalPort()+prjName+"/webpage/utils/proxy/httpproxygb2312.jsp";
    
    if(targetUrl==null) return;
    else
    {
    	targetUrl=targetUrl.replaceAll(":::","&");
    }
    if(method==null)
    {
    	method="GET";
    }
    else
    {
    	method=method.toUpperCase();
    }
    URL url = new URL(targetUrl);   
    urlConnection = (HttpURLConnection) url.openConnection();   
    urlConnection.setRequestMethod(method);   
    urlConnection.setDoOutput(true);   
    urlConnection.setDoInput(true);   
    urlConnection.setUseCaches(false);   
     
     try {   
         InputStream in = urlConnection.getInputStream(); 
         
         //首先尝试用utf-8解码
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in,"utf-8"));   
         
         temp = new StringBuffer();   
         String line = bufferedReader.readLine();   
         while (line != null) 
         {   
             temp.append(line).append("\r\n");   
             line = bufferedReader.readLine();   
         }   
         bufferedReader.close();   
         content = temp.toString(); 

         //解析头文件--获取字符串的编码方式
         String testContent=content;
         //如果是GB2312编码格式,再做gb2312转换
         if(testContent.toLowerCase().indexOf("encoding=\"gb2312\"")!=-1 || testContent.toLowerCase().indexOf("encoding='gb2312'")!=-1)
         {
         	content="";
         	String reloadProxy=proxygb2312+"?requestmethod=get&url="+targetUrl.replaceAll("&",":::");
         	url = new URL(reloadProxy);   
		    urlConnection = (HttpURLConnection) url.openConnection();   
		
		    urlConnection.setRequestMethod(method);   
		    urlConnection.setDoOutput(true);   
		    urlConnection.setDoInput(true);   
		    urlConnection.setUseCaches(false);
		    
		    in = urlConnection.getInputStream(); 
	        bufferedReader = new BufferedReader(new InputStreamReader(in,"GB2312"));   
	         
	         temp = new StringBuffer();   
	         line = bufferedReader.readLine();   
	         while (line != null) 
	         {   
	             temp.append(line).append("\r\n");   
	             line = bufferedReader.readLine();   
	         }   
	         bufferedReader.close(); 
	         content = temp.toString(); 
		 }
         else
         {
        	 //TODO 图片代理(目前仅适用于IE)
        	request.setCharacterEncoding("utf-8");
            Image srcImage = javax.imageio.ImageIO.read(url);   
            if(srcImage!=null){
            	proxyType = "img";//TODO 标记为图片代理
            	content="";
	            //保持原始宽高
	            int old_w=srcImage.getWidth(null);  //更改大小可制作缩略图                                   
	            int old_h=srcImage.getHeight(null); //更改大小可制作缩略图
	            BufferedImage tag = new BufferedImage(old_w,old_h,BufferedImage.TYPE_INT_RGB);
	            Color bgcolor = new Color(255,255,255);//白色背景色
	            tag.getGraphics().drawImage(srcImage,0,0,old_w,old_h,bgcolor,null);    
	            
	            FileOutputStream newimage=new FileOutputStream("png.png");          
	            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);      
	            encoder.encode(tag);                                               
	            newimage.close();   
	            ImageIO.write(tag, "JPG", response.getOutputStream());
	            //TODO 用于屏蔽servlet的异常
	            out.clear();
	            out=pageContext.pushBody();
            }
         }
     } catch (IOException e) {   
     	e.printStackTrace();
         throw e;   
     } finally {   
         if (urlConnection != null)   
             urlConnection.disconnect();   
     }
%>
<%
	//不是图片代理则输出文本
	if(!"img".equals(proxyType)){
		%>
			<%=content%>
		<%
	}
%>

?

?

/*
作用:
	- 解决跨域访问的问题。
实现:
	- 文本内容的代理(多用于请求服务)
	- 图片文件的代理

使用范例:
	- 文本代理:http://localhost:8080/exchange//webpage/utils/proxy/httpproxy.jsp?requestmethod=post&url=http://172.16.10.6:8080/sgs/actions/getCatalogs.action?userId=41:::catalogType=1:::catalogCode=330000000000020000:::show=true&_dc=1348106642931
	- _dc是自动添加的随机数

	- 图片代理:http://localhost:8080/exchange//webpage/utils/proxy/httpproxy.jsp?requestmethod=post&url=http://www.baidu.com/img/baidu_sylogo1.gif

*/
?

?

?

?

?

?

愤怒的coder- 钓鱼岛是中国的

?

?

  相关解决方案