<%@ 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- 钓鱼岛是中国的