09解决AJAX中文乱码与跨域访问.docx
- 文档编号:11976406
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:8
- 大小:40.99KB
09解决AJAX中文乱码与跨域访问.docx
《09解决AJAX中文乱码与跨域访问.docx》由会员分享,可在线阅读,更多相关《09解决AJAX中文乱码与跨域访问.docx(8页珍藏版)》请在冰豆网上搜索。
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方式不需要name属性,需要一个id的属性-->
--这个div用于存放服务器端返回的信息,开始为空-->
--id属性定义是为了利用dom的方式找到某一个节点,进行操作-->
--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好-->
--
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=
//我们
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 解决 AJAX 中文 乱码 访问