您的位置:首页 > 其它

17_解决Ajax中文乱码与跨域访问

2009-01-25 12:03 344 查看
AJAX中文乱码问题的解决方法有两种:

(1)页面端数据作一次encodeURI,服务器端稍作改变即可

面面端verify.js脚本:

function verify()
{
//1.接收html数据
//解决中文乱码问题的方法:1页面端发出的数据作一次encodeURI,服务器端使用
//解决中文乱码问题的方法:2页面端发出的数据作两次的encodeURI,服务器端作一次URLDecoder.decode(old,"UTF-8");
var url ="AJAXServer?name="+encodeURI($("#userName").val());//页面端发出的数据作一次encodeURI
url = convertURL(url);
$.get(url,function (data)
{
$("#result").html(data);

});
//2.对数据进行发送
//3.回调函数
}
function convertURL(url)
{
var timetamp = (new Date()).valueOf();
if(url.indexOf("?")>=0)
{
url=url+"&t"+timetamp;
}
else
{
url=url+"?t"+timetamp;
}
return url;
}


服务器端的程序稍作修改即可,对字符串用指定方式编码:

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-5
* Time: 21:26:55
* To change this template use File | Settings | File Templates.
*/
public class AJAXServer extends HttpServlet
{
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
doGet(httpServletRequest, httpServletResponse);
}

protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
//写校验代码

try{

httpServletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
Integer inte = (Integer)httpServletRequest.getSession().getAttribute("total");
int temp = 0;
//1.取参数信息
if (inte == null)
{
temp = 1;
}
else
{
temp = inte.intValue() + 1;
}
httpServletRequest.getSession().setAttribute("total",temp);

String old = httpServletRequest.getParameter("name");
String name = new String(old.getBytes("iso8859-1"),"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(Exception e){
e.printStackTrace();
}
}
}


******************************************

(2)解决中文乱码问题:页面端发出的数据作两次encodeURI,服务器作一URLDecoder.decode(old,UTF-8)

页面端verify.js的脚本:

function verify()
{
//1.接收html数据
//解决中文乱码问题的方法:1页面端发出的数据作一次encodeURI,服务器端使用
//解决中文乱码问题的方法:2页面端发出的数据作两次的encodeURI,服务器端作一次URLDecoder.decode(old,"UTF-8");
var url ="AJAXServer?name="+encodeURI(encodeURI($("#userName").val()));//页面端的数据作两次encodeURI
url = convertURL(url);

$.get(url,function (data)
{
$("#result").html(data);

});
//2.对数据进行发送
//3.回调函数
}
function convertURL(url)
{
var timetamp = (new Date()).valueOf();
if(url.indexOf("?")>=0)
{
url=url+"&t"+timetamp;
}
else
{
url=url+"?t"+timetamp;
}
return url;
}


服务器端的数据作一次URLDecoder.decode(old,UTF-8);的解码工作,服务器端只作一次的解码工作就可以了,因为在浏览器的内部还会做一次解码,所以服务器只作一次就可以了

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

/**
* Created by IntelliJ IDEA.
* User: Administrator
* Date: 2009-1-5
* Time: 21:26:55
* To change this template use File | Settings | File Templates.
*/
public class AJAXServer extends HttpServlet
{
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
doGet(httpServletRequest, httpServletResponse);
}

protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
//写校验代码

try{
httpServletResponse.setContentType("text/html;charset=utf-8");
PrintWriter out = httpServletResponse.getWriter();
Integer inte = (Integer)httpServletRequest.getSession().getAttribute("total");
int temp = 0;
//1.取参数信息
if (inte == null)
{
temp = 1;
}
else
{
temp = inte.intValue() + 1;
}
httpServletRequest.getSession().setAttribute("total",temp);

String old = httpServletRequest.getParameter("name");
String name = URLDecoder.decode(old,"UTF-8");//这是服务器端做的一次解码工作

//2.检查参数是否有问题
if(old == null || old.length() == 0){
out.println("用户名不能为空");
} else{
//3.校验操作
//                String name = old;
if(name.equals("wangxingkui")){
//4。和传统应用不同之处。这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户
//写法没有变化,本质发生了改变
out.println("用户名[" + name + "]已经存在,请使用其他用户名, " + temp);
} else{
out.println("用户名[" + name + "]尚未存在,可以使用该用户名注册, " + temp);
}
}
} catch(Exception e){
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: