您的位置:首页 > 其它

SSH中post提交表单action中文乱码问题

2017-03-04 12:06 549 查看
原   文  

我的问题对应的解决方案是:web.xml中filter的顺序问题【置顶】。需要将编码过滤器放置在所有过滤器之前。

在解决这个问题途中学习到的东西:

解决方案总结(post中文乱码):

前后台编码方式一致;
结合过滤器的使用;
表单传输方式的指定;
Tomcat的server.xml;

1.前台:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<%

    request.setCharacterEncoding("UTF-8");

%>

2.后台Struts.xml配置文件:

<constant name="struts.i18n.encoding" value="UTF-8"/>

3.web.xml中的过滤器(以下两个都可以,择一即可)

  <!-- spring的中文乱码拦截器(必须置顶) -->

  <filter>

         <filter-name>EncodingFilter</filter-name>

         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

         <init-param>

             <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>

 

  <!-- 自定义的struts2的中文乱码拦截器(置顶) -->

 <filter>

      <filter-name>CharEncodingFilter</filter-name>

      <filter-class>com.sram.filter.CharEncodingFilter</filter-class>

      <init-param>

          <param-name>encoding</param-name>

          <param-value>UTF-8</param-value>

      </init-param>

  </filter>

  <filter-mapping>

      <filter-name>CharEncodingFilter</filter-name>

      <url-pattern>/*</url-pattern>

  </filter-mapping>

  

package com.sram.filter;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class CharEncodingFilter implements Filter{

    String encoding;

    @Override

    public void destroy() {

        // TODO Auto-generated method stub

        

    }

    @Override

    public void doFilter(ServletRequest req, ServletResponse resp,

            FilterChain chain) throws IOException, ServletException {

        // TODO Auto-generated method stub

        req.setCharacterEncoding(encoding);

        chain.doFilter(req, resp);

    }

    @Override

    public void init(FilterConfig config) throws ServletException {

        // TODO Auto-generated method stub

        encoding  = config.getInitParameter("encoding");

        if(encoding==null||encoding.equals("")){

            encoding  = "UTF-8";

        }

    }

}

4.将form表单提交方式变为post方式,即添加method="post"

5.Tomcat的server.xml没有配置编码,添加URIEncoding="UTF-8"就可以了

 

<Connector port="6060" protocol="HTTP/1.1" 

               connectionTimeout="20000" 

               redirectPort="8443" URIEncoding="UTF-8" 

useBodyEncodingForURI="true" 

/>

6.在action中重编码,在指定参数的set方法中,将编码设会“UTF-8",例如:需要修改每个参数的set方法,比较麻烦(不推荐)

 public void setCopyRight(String copyRight){  

    try {  

this .copyRight = java.net.URLDecoder.decode (copyRight, "UTF-8" ); 

}  catch (UnsupportedEncodingException e) {  

              e.printStackTrace();  

}

}

补充post方式:



补充get方式:

如果提交方式为get,设置request对象的编码是无效的,想不乱码,只能手工转换。

1.  String data = "???????";//乱码字符串

     byte source [] = data.getBytes("iso8859-1");//得到客户机提交的原始数据

     data = new String (data.getBytes("iso8859-1"),"UTF-8");//解决乱码

     //等同于

    data = new String (source,"UTF-8");

2.get方式的乱码,还可以通过更改服务器配置的方式实现。更改Tomact的conf目录下的server.xml文件。

      2.1    

这种方式并不推荐,因为更改了服务器且并不灵活。

      2.2

这么设置后,request的setCharacterEncoding设置什么编码,连接器就用什么编码,虽然比上一种更改灵活,但依然会导致我们的应用程序牢牢依赖于服务器,也不被推荐。

 

参考网址:http://www.cnblogs.com/yyz666/p/4051294.html

      http://www.cnblogs.com/wanggangblog/p/3477525.html

      http://www.cnblogs.com/chenssy/p/4220400.html

     Struts2拦截器解决乱码问题http://blog.csdn.net/a9529lty/article/details/7069040
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乱码 web.xml ssh 表单