当前位置: 代码迷 >> Java Web开发 >> spring乱码有关问题,初学者求教
  详细解决方案

spring乱码有关问题,初学者求教

热度:5867   发布时间:2016-04-10 22:56:43.0
spring乱码问题,菜鸟求教
这是个springMVC传参 出现乱码问题
我没有使用JQuery,因为项目比较小,自己写了个JS
先来说说我的设置,最后说问题:

function postSend(url, params) {
var _post = document.createElement("form");
_post.action = url;
_post.method = "POST";
_post.style.display = "none";
document.body.appendChild(_post);
_post.submit();
return _post;
}


接着,我在web.xml中加了过滤:
<filter>
<description>字符集过滤器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<description>字符集编码</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


之后,我在JSP中的头部写了page:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" 
contentType="text/html; charset=UTF-8"%>
<%
String queryRole  = "查询角色" ;
String deleteRole = "删除角色" ;
String alterRole  = "修改角色" ;
String createRole = "新建角色" ;
%>
.......略去次要的 ......
----------------------JS ----------
function createRole(){
alert("<%=createRole%>");
postSend("<%=basePath%>havePowerCreateRole.do?funOptType="+"<%=createRole%>");
}


最后,我在后台接收:

@RequestMapping("havePowerCreateRole")
public Object havePowerCreateRole(String funOptType ,HttpServletRequest req){

ModelAndView mv = new ModelAndView();
HttpSession session = req.getSession();
List<String> funOptTypeList = (List<String>) session.getAttribute("funOptTypeList");
for( int i=0 ; i<funOptTypeList.size() ; i++ ){
if( funOptTypeList.get(i).equalsIgnoreCase(funOptType) ){
mv.setViewName("jsp/body/admin/createRole");
return mv;
}
}
  ModelAndView error = mv ;
  error .addObject("errorTip", havePowerCreateRoleErrorTip);
  error.setViewName("jsp/error");
  mv = null ;
  return error ;
}

问题:
问题来了,我在前台跳转前特地alert("<%=createRole%>");,显示出了正确的中文字,
但是真正跳转后,接受者havePowerCreateRole接收到的参数funOptType确是乱码,
问题百思不得其解,求教! 
------解决方案--------------------
postSend("<%=basePath%>havePowerCreateRole.do?funOptType="+encodeURI("<%=createRole%>"));
加上encodeURI编码,后台如果还乱码用URLDecoder.decode
------解决方案--------------------
不要在queryString中传递中文,问题太多了,服务器端需要配置或者转码,而且不一定能解决,就是浏览器也能设置接受参数的编码,所以这个问题较真一点说可以说是无解的。
参数最好传递编码,只用英文和数字最好。
------解决方案--------------------
引用:
Quote: 引用:

postSend("<%=basePath%>havePowerCreateRole.do?funOptType="+encodeURI("<%=createRole%>"));
加上encodeURI编码,后台如果还乱码用URLDecoder.decode


你的这个思路很棒,我用了两次encodeURI()就可以了,这样:encodeURI(encodeURI("<%=createRole%>"))。


刚刚说错了:
但我不明白:
1、为什么要encodeURI
2、为什么要2次encodeURI包装<%=createRole%>才能,然后后台URIDecode.decode()才能获取正确的值?

因为URIDecode.decode()会解码一次,,然后服务器会自己再解码一次。
  相关解决方案