AJAX跨域访问——XMLHttpRequest代理实现

浏览器安全策略禁止JavaScript跨域访问,但服务器端无此限制。通过在服务器端创建XMLHttpRequest代理,可以规避浏览器限制,实现跨域请求。代理负责访问其他域名资源,然后将结果返回给客户端的AJAX请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跨域访问简单来说就是A网站的JavaScript代码试图访问B网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.在广域网环境中,由于浏览器的安全限制,网络连接的跨域访问时不被允许的,XmlHttpRequest也不例外。但有时候跨域访问资源是必需的。

 

我们不能在浏览器端直接使用AJAX来跨域访问资源,但是在服务器端是没有这种跨域安全限制的。所以,我们只需要让服务器端帮我们完成“跨域访问”的工作,然后在浏览器端用AJAX获取服务器端“跨域访问”的结果就可以了。这就是所谓的在服务器端创建一个 XmlHttpRequest代理,通过这个代理来访问其他域名下的资源。

 

使用XmlHttpRequest访问同一域名下的资源:直接访问:


 

用服务器端的XmlHttpRequest代理来跨域访问资源:
 

 

if(url.indexOf("http://")==0){  
     url=url.replace("?","&");  
     url="Proxy?url"+url;  
}

 

public class Proxy extends javax.servlet.http.HttpServlet {  
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)  
            throws javax.servlet.ServletException, java.io.IOException  {  
        response.setContentType("text/html;charset=GB2312");  
        String url = request.getParameter("url");  
        StringBuffer param = new StringBuffer();  
        Enumeration enu = request.getParameterNames();  
        int total = 0;  
        while(enu.hasMoreElements()){  
            String name = (String)enu.nextElement();  
            if(!name.equals("url")){  
                if(total == 0){  
                    param.append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));  
                } else{  
                    param.append("&").append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));  
                }  
                total++;  
  
            }  
        }  
        PrintWriter out = response.getWriter();  
        if(url != null){  
            URL connect = new URL(url.toString());  
            URLConnection connection = connect.openConnection();  
            connection.setDoOutput(true);  
            OutputStreamWriter paramout = new OutputStreamWriter(connection.getOutputStream());  
            paramout.write(param.toString());  
            paramout.flush();  
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"GB2312"));  
            String line;  
            while((line = reader.readLine()) != null){  
               out.println(line);  
            }  
            paramout.close();  
            reader.close();  
        }  
  
    } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值