09解决AJAX中文乱码与跨域访问.docx

上传人:b****5 文档编号:11976406 上传时间:2023-04-16 格式:DOCX 页数:8 大小:40.99KB
下载 相关 举报
09解决AJAX中文乱码与跨域访问.docx_第1页
第1页 / 共8页
09解决AJAX中文乱码与跨域访问.docx_第2页
第2页 / 共8页
09解决AJAX中文乱码与跨域访问.docx_第3页
第3页 / 共8页
09解决AJAX中文乱码与跨域访问.docx_第4页
第4页 / 共8页
09解决AJAX中文乱码与跨域访问.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

09解决AJAX中文乱码与跨域访问.docx

《09解决AJAX中文乱码与跨域访问.docx》由会员分享,可在线阅读,更多相关《09解决AJAX中文乱码与跨域访问.docx(8页珍藏版)》请在冰豆网上搜索。

09解决AJAX中文乱码与跨域访问.docx

09解决AJAX中文乱码与跨域访问

verify.js:

functionverify(){

//解决中文乱码问题的方法1,页面端发出的数据做一次encodeURI,服务器端使用newString(old.getBytes("iso8859-1"),"UTF-8");

//解决中文乱码问题的方法2,页面端发出的数据做两次encodeURI,服务器端使URLDecoder.decode(old,"UTF-8");

varuserName=$("#userName").val();

$.get("AjaxServer?

name="+encodeURI(encodeURI(userName)),null,function(data){

  $("#result").html(data);

});

}

推荐使用方法2,因为方法1中使用硬编码“ISO-8859-1”了。

AjaxServer.java:

importjava.io.IOException;

importjava.io.PrintWriter;

import.URLDecoder;

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebInitParam;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

/**

*ServletimplementationclassAjaxServer

*/

@WebServlet(description="whdescription",urlPatterns={"/AjaxServer"},initParams={@WebInitParam(name="name",value="",description="whname")})

publicclassAjaxServerextendsHttpServlet{

privatestaticfinallongserialVersionUID=1L;

/**

*@seeHttpServlet#HttpServlet()

*/

publicAjaxServer(){

  super();

  //TODOAuto-generatedconstructorstub

}

/**

*@seeHttpServlet#doGet(HttpServletRequestrequest,HttpServletResponse

*     response)

*/

protectedvoiddoGet(HttpServletRequestrequest,

   HttpServletResponseresponse)throwsServletException,IOException{

  try{

   response.setContentType("text/html;charset=UTF-8");

   //response.setCharacterEncoding("UTF-8");

   PrintWriterout=response.getWriter();

   Integerinte=(Integer)request.getSession().getAttribute("total");

   inttemp=0;

   if(inte==null)

    temp=1;

   else

    temp=inte.intValue()+1;

   request.getSession().setAttribute("total",temp);

   //1.取参数信息

   Stringold=request.getParameter("name");

   //Stringname=newString(old.getBytes("ISO-8859-1"),"UTF-8");

   Stringname=URLDecoder.decode(old,"UTF-8");

   //2.检查参数是否有问题

   if(old==null||old.length()==0){

    out.println("用户名不能为空");

   }else{

    //3.校验操作

    if(name.equals("wangxingkui")){

     //4.和传统应用不同之处。

这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户

     //写法没有变化,本质发生了改变

     out.println("用户名["+name+"]已经存在,请使用其他用户名,"+temp);

    }else{

     out.println("用户名["+name+"]尚未存在,可以使用该用户名,"+temp);

    }

   }

  }catch(Exceptione){

   e.printStackTrace();

  }

}

/**

*@seeHttpServlet#doPost(HttpServletRequestrequest,HttpServletResponse

*     response)

*/

protectedvoiddoPost(HttpServletRequestrequest,

   HttpServletResponseresponse)throwsServletException,IOException{

  doGet(request,response);

}

}

ajax.html:

DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:

//www.w3.org/TR/html4/loose.dtd">

用户名校验ajax实例

--基于标准的一些好习惯,首先标签名要小写,其次标签必须关闭,第三属性名必须是小写的,第四属性值必须位于双引号中-->

用户名校验的ajax实例,请输入用户名:


--ajax方式下不需要使用表单来进行数据提交,因此不用写表单标签-->

--ajax方式不需要name属性,需要一个id的属性-->

--这个div用于存放服务器端返回的信息,开始为空-->

--id属性定义是为了利用dom的方式找到某一个节点,进行操作-->

--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好-->

--

123
456

123456

显示效果如下:

123

456

123456

-->

XMLHttpRequest的一个特殊安全问题:

IE:

访问跨域页面时会给出提示,用户确认后会访问

MozillaFireFox及其他:

不允许访问跨域页面

解决办法:

使用代理:

在浏览器端的代码中,我们需要在调用open方法之前判断一下要连接的地址是不是以http开头的,如果是则认为要访问的是跨域的资源,首先将当前url中的”?

”变成”&”,这是因为将要连接的地址改为”Proxy?

url=”+url以后,如果原来url地址中有参数的话,新的url地址中就会有两个“?

”这会导致服务器端解析参数错误,”url=”之后的内容表示本来要访问的跨域资源的地址。

functionconvertURL(url){

if(url.substring(0,7)=="http:

//"){

     url=url.replace("?

","&");

     url="Proxy?

url="+url;

}

returnurl;

}

注意Proxy中针对GET方式和POST方式进行了分别的处理,其中GET方式仍然将参数信息拼到URL中,而POST方式则向HttpURLConnection的数据流中添加参数信息。

由于对本来请求的地址和其包含的参数进行了转换,导致url参数中只包含原来请求的地址信息,而原来请求的参数信息则需要我们解析出来和地址信息一起重新组成本来的请求URL,因此方法开头的一段while就做了这个工作。

注意由于进入servelt之前参数信息已经被做过一次URLDecoder,因此这个时候参数信息中的中文信息传到真正要访问的servlet时解码会出现乱码,因此我们再拼接参数信息之前又再一次通过URLEncoder.encode方法对所有参数信息进行了一次编码,这样就解决了中文的乱码问题。

在从远端服务器读取数据时,要显示的指定输入流的编码格式,这样才可以保证通过BufferReader读到的内容不会有乱码信息。

Proxy.java:

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.PrintWriter;

importjava.io.OutputStreamWriter;

import.*;

importjava.util.Enumeration;

publicclassProxyextendsjavax.servlet.http.HttpServlet{

   protectedvoiddoPost(javax.servlet.http.HttpServletRequestrequest,javax.servlet.http.HttpServletResponseresponse)

           throwsjavax.servlet.ServletException,java.io.IOException{

       response.setContentType("text/html;charset=GB2312");

       Stringurl=request.getParameter("url");

       StringBufferparam=newStringBuffer();

       Enumerationenu=request.getParameterNames();

       inttotal=0;

       while(enu.hasMoreElements()){

           Stringname=(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++;

           }

       }

       PrintWriterout=response.getWriter();

       if(url!

=null){

           URLconnect=newURL(url.toString());

           URLConnectionconnection=connect.openConnection();

           connection.setDoOutput(true);

           OutputStreamWriterparamout=newOutputStreamWriter(connection.getOutputStream());

           paramout.write(param.toString());

           paramout.flush();

           BufferedReaderreader=newBufferedReader(newInputStreamReader(connection.getInputStream(),"GB2312"));

           Stringline;

           while((line=reader.readLine())!

=null){

              out.println(line);

           }

           paramout.close();

           reader.close();

       }

   }

   protectedvoiddoGet(javax.servlet.http.HttpServletRequestrequest,javax.servlet.http.HttpServletResponseresponse)throwsjavax.servlet.ServletException,java.io.IOException{

       response.setContentType("text/html;charset=GB2312");

       StringBufferurl=newStringBuffer();

       url.append(request.getParameter("url"));

       Enumerationenu=request.getParameterNames();

       inttotal=0;

       while(enu.hasMoreElements()){

           Stringname=(String)enu.nextElement();

           if(!

name.equals("url")){

               if(total==0){

                   url.append("?

").append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));

               }else{

                   url.append("&").append(name).append("=").append(URLEncoder.encode(request.getParameter(name),"UTF-8"));

               }

               total++;

           }

       }

       PrintWriterout=response.getWriter();

       if(url!

=null){

            URLconnect=newURL(url.toString());

            BufferedReaderreader=newBufferedReader(newInputStreamReader(connect.openStream(),"GB2312"));

            Stringline;

            while((line=reader.readLine())!

=null){

               out.println(line);

            }

            reader.close();

       }

       

       Proxy?

url=

       url=

       

//我们

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1