`
sungang_1120
  • 浏览: 322758 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

get提交 超链接提交 解决中文乱码问题

 
阅读更多
get提交  超链接提交  解决中文乱码问题


GET提交:
解决一:
String key = "中文";
key = new String(key.getBytes("ISO8859-1"),"UTF-8");
但是这种不建议使用,

解决二:

可以再Tomcat配置文件server.xml配置
<Connector port="8080" protocol="HTTP/1.1"
               maxThreads="150" connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

每次提交都会从这里过滤中文

超链接提交:

可以在jsp中设置:
<a href="?key=<%=URLEncoding.encode("中文","UTF-8")%>


附加:System.out.println(java.net.URLEncoder.encode("中文", "UTF-8"));
System.out.println(java.net.URLEncoder.encode("%E4%B8%AD%E6%96%87", "UTF-8"));

结果输出:
%E4%B8%AD%E6%96%87
中文




在web.xml配置过滤器

   <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>
                <init-param>
                    <param-name>forceEncoding</param-name>
                    <param-value>false</param-value>
               </init-param>
        </filter>
        <filter-mapping>
                <filter-name>encodingFilter</filter-name>
                <url-pattern>/*</url-pattern>
       </filter-mapping>
和普通过滤器配置没什么区别,就是多了两个初始化参数,两个参数的作用分别是:
    encoding----->用来指定一个具体的字符集
    forceEncoding------->Spring的早期版本这个参数作用很单一,当request中已经被指定了一个字符集的时候是否再将用endcoding对应的字符集设置到request中去。举个例子来说明,假如说过滤器就像上面那样被配置到web.xml了,当请求被提交之后,过滤器会判断request.getCharacterEncoding()是否为null,如果是null那么就会进行request.setCharacterEncoding("UTF-8")的操作,如果不是null那么过滤器什么也不会做。
    不过Spring目前得版本这个类的代码已经被重构了,代码更加“漂亮”了,这个参数的作用也发生了细微的改变。
    为了加深印象从源码来分析一下这个参数的变化。
    首先,说明 一下CharacterEncodingFilter是继承OncePerRequestFilter抽象类而来的,OncePerRequestFilter实现了doFilter方法:
public final void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
   throws ServletException, IOException {
         ...........
         ...........
      String alreadyFilteredAttributeName = getAlreadyFilteredAttributeName();
      if (request.getAttribute(alreadyFilteredAttributeName) != null || shouldNotFilter(httpRequest)) {
           filterChain.doFilter(request, response);
      }
      else {
           request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE);
       try {
            doFilterInternal(httpRequest, httpResponse, filterChain);
           }
       finally {
            request.removeAttribute(alreadyFilteredAttributeName);
           }
      }
}
public static final String ALREADY_FILTERED_SUFFIX = ".FILTERED";(在OncePerRequestFilter中定义的常量)
说明:
1. getAlreadyFilteredAttributeName()方法返回的字符串是="我们给filter配置的名字+ALREADY_FILTERED_SUFFIX",所以request请求第一次到达过滤器的时候request.getAttribute(alreadyFilteredAttributeName) 值一定是null ,shouldNotFilter(httpRequest)方法默认实现始终返回false(这个方法也可以在子类中进行扩展);
2. 当request.setAttribute(alreadyFilteredAttributeName, Boolean.TRUE)之后就会执行doFilterInternal(httpRequest, httpResponse, filterChain);方法了,doFilterInternal这里是个抽象方法,它是在子类CharacterEncodingFilter中被实现的,实现如下:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
   throws ServletException, IOException {
         if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
                request.setCharacterEncoding(this.encoding);
               if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
                    response.setCharacterEncoding(this.encoding);
                   }
              }
              filterChain.doFilter(request, response);
  }
private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(
   HttpServletResponse.class, "setCharacterEncoding", new Class[] {String.class});
说明:
1. 静态常量responseSetCharacterEncodingAvailable 是通过反射来判断response是否有setCharacterEncoding方法,返回值应该都是true.
2. this.encoding != null :当encoding初始化参数被指定时条件满足。
3. (this.forceEncoding || request.getCharacterEncoding() == null )==true:当forceEncoding初始化参数设置为true或者request已经被指定了一个字符编码的时候条件满足。
如果没记得错,Spring早期版本这个方法得实现应该是:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
   throws ServletException, IOException {
         if (this.forceEncoding || request.getCharacterEncoding() == null) {
                   request.setCharacterEncoding(this.encoding);
              }
              filterChain.doFilter(request, response);
  }
参数forceEncoding的作用很明显了吧!以前只是对request字符编码起作用,现在如果将forceEncoding设为true也会影响到response中的字符编码,通常这个是我们不希望的。
总结:
1.  OncePerRequestFilter这个抽象过滤器很好的实现了对每个request只执行一次过滤操作,如果有类似的需求可以继承该类并实现doFilterInternal方法来完成。
2.  CharacterEncodingFilter类可以通过简单配置来帮我们实现字符集转换的功能。另外多说一句,如果采用Struts2.0的MVC框架我个人感觉中文问题已经不是问题了,可以通过配置struts.i18n.encoding常量来实现统一字符编码。


自己配置一个过滤器了也可以

<filter> 
        <filter-name>EncodingFilter</filter-name> 
        <filter-class>com.kenshin.base.SysFilter</filter-class> 
        <init-param> 
            <param-name>encoding</param-name> 
            <param-value>UTF-8</param-value> 
        </init-param> 
        <init-param> 
            <param-name>enable</param-name> 
            <param-value>true</param-value> 
        </init-param> 
    </filter> 
    <filter-mapping> 
        <filter-name>EncodingFilter</filter-name> 
        <url-pattern>*.do</url-pattern> 
    </filter-mapping> 

package com.kenshin.base;  
 
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;  
 
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.Transaction;  
 
public class SysFilter implements Filter {  
    protected String sEncodingName;  
 
    protected FilterConfig sysFilter;  
 
    protected boolean bEnable;  
 
    protected Log logger = LogFactory.getLog(SysFilter.class);  
 
    public void destroy() {  
 
    }  
 
    public void doFilter(ServletRequest arg0, ServletResponse arg1,  
            FilterChain arg2) throws IOException, ServletException {  
        // TODO Auto-generated method stub  
        if (this.bEnable) {  
            try {    
                arg0.setCharacterEncoding(this.sEncodingName);  
                arg1.setContentType("text/html;charset=" + this.sEncodingName);  
                arg1.setCharacterEncoding(this.sEncodingName);  
                arg2.doFilter(arg0, arg1);  
 
            } catch (Exception e) {  
                logger.info("出错了");  
            }  
            // session.close();  
        } else {  
            arg2.doFilter(arg0, arg1);  
        }  
    }  
 
    public void init(FilterConfig arg0) throws ServletException {  
        // TODO Auto-generated method stub  
        this.sysFilter = arg0;  
        this.loadFilterSetting();  
    }  
 
    private void loadFilterSetting() {  
        this.sEncodingName = this.sysFilter.getInitParameter("encoding");  
        logger.info("encoding:" + sEncodingName);  
        String sEnable = this.sysFilter.getInitParameter("enable");  
        if (sEnable != null && sEnable.equalsIgnoreCase("true")) {  
            this.bEnable = true;  
        } else {  
            this.bEnable = false;  
        }  
    }  
}  

分享到:
评论

相关推荐

    html 中文乱码 HTML超链接中文乱码问题分析及解决方法

    Vm中一个超链接URL需要拼接中文作为Get请求的参数。如果直接拼接,传到后台Action的参数对象中后取出会是乱码,需要编码后再拼接到URL上。 解决方法是在Action中添加一个成员变量,保存编码后的中文参数。在vm页面...

    HTML超链接中文乱码问题分析及解决方法.docx

    本文将分析超链接中文乱码问题的成因和解决方法。 问题分析 在 HTML 超链接中,当我们需要将中文参数作为 GET 请求的参数时,直接拼接中文参数到 URL 上可能会导致乱码。例如,在一个超链接 URL 中,我们需要将...

    乱码问题的解决

    "乱码问题的解决" 在 Web 开发中,乱码问题是常见的...乱码问题的解决需要从多方面入手,包括设置页面编码、服务器编码、客户端编码、数据库编码和超链接的 url 编码等。只有通过统一编码,才能避免乱码问题的出现。

    Struts2.0解决中文乱码

    本文将深入探讨如何在Struts2.0中解决中文乱码问题,确保应用程序能够正确地处理和显示中文字符。 ### Struts2.0中文乱码问题分析 #### 1. 表单提交中文乱码 在Web应用中,表单是用户与服务器交互的主要方式之一...

    ubuntu下添加windows字体解决latex中文乱码问题.docx

    "Ubuntu 下添加 Windows 字体解决 LaTeX 中文乱码问题" 在 Ubuntu 操作系统中,添加 Windows 字体可以解决 LaTeX 中文乱码问题。该问题的出现是因为 Ubuntu 缺乏中文字体,导致 LaTeX 无法正确显示中文字符。解决这...

    解决中文乱码的几种解决方法(推荐)

    解决中文乱码的问题是中文用户在使用计算机系统、网络以及各种编程语言中经常遇到的麻烦。由于中文字符集的特殊性,如果在数据传输或存储过程中处理不当,就会出现乱码问题。中文乱码主要发生在数据编码和解码的过程...

    解决Servlet中文乱码问题.docx

    以下是一份详细的指南,涵盖了如何解决Servlet中的中文乱码问题。 **一、出现乱码的原因** 当浏览器向服务器发送请求或接收服务器返回的数据时,如果编码格式不统一,就会导致乱码。默认情况下,Servlet容器(如...

    Servlet中文乱码问题解决方案解析

    如果是通过超链接传递参数,超链接是get提交,必须手工修改编码。 3. 浏览器显示乱码 浏览器显示乱码是指浏览器显示中文字符时出现的乱码问题。解决方法是: response.setContentType("text/html;charset=UTF-8")...

    JAVA开发中各种中文乱码问题

    5. **超链接中的中文问题**:在超链接中包含中文字符时,即使在web.xml中设置了字符集转换的Filter,Servlet仍然可能接收到乱码。这是因为URL编码默认使用的是UTF-8,而不是GBK。需要手动对URL参数进行编码和解码。 ...

    javaweb乱码

    以下是对javaweb中文乱码问题的详细解析和解决方案: **乱码原理:** 1. **请求乱码**:在IE浏览器中,用户填写的数据(如中文“中国”)是以当前页面的字符编码(如UTF-8或GBK)提交的。当这些数据通过HTTP请求...

    过虑word复制引起的不能提交

    总的来说,解决“过滤word复制引起的不能提交到mysql数据库”问题需要关注字符编码一致性、数据格式清理和数据库字段设置。通过编写合适的PHP脚本,可以有效地处理这个问题,保证数据的正确导入和存储。

    解析WEB开发编码问题

    1. **浏览器向应用服务器发送请求**:可以通过表单提交(POST或GET)、超链接或Ajax实现。在POST请求中,表单数据按页面编码(如UTF-8)转为字节流发送。对于GET请求,表单值会URI编码后附加到URL,如“test=%E4%B8%...

    java常见问题.doc

    6. **JSP页面超链接传递参数的乱码问题** 当在网页上通过超链接传递参数时,如果出现乱码,通常是由于字符编码不一致造成的。解决方式是在发送和接收页面都设置正确的字符编码。发送端可以在超链接页面添加`("text/...

    ajax下载smartupload的内容无法显示汉字的解决方法

    遵循以上步骤,你应该能成功解决汉字显示乱码的问题,并实现文件的正常下载。如果在实际应用中仍有问题,可能需要进一步检查代码的其他部分,例如文件上传时的编码设置、文件存储的编码一致性等。

    图书管理系统servlet+mysql+jdbc+html.doc

    设置页面的标题图标和UTF-8编码以解决中文乱码问题。 5. **Cookie与Session**:Cookie用于在客户端存储用户信息,如登录状态,使得用户在一定时间内无需重复登录。Session在服务器端存储用户信息,当用户完成操作或...

    Servlet板书

    - GET方式:查询字符串、超链接、表单提交(默认GET)和框架窗口。 - POST方式:仅限于表单提交,可以通过JavaScript动态改变表单的提交方式。 6. **多值参数处理**: - 对于多个同名参数,`getParameterValues...

    jsp中四种传递参数的方法

    当使用 GET 方法提交时,表单数据会附加在 URL 后面,可能会出现中文乱码。解决方法是,先将获取到的参数值转换为字节数组,再转换成指定编码格式的字符串。 ```java String name = request.getParameter("name"); ...

    JSP应用开发-论坛主题帖显示.pptx

    对于POST提交方式导致的中文乱码,可以在JSP页面顶部添加`request.setCharacterEncoding("GBK")`来设置请求编码。而对于GET方式或请求转发模式下的乱码,可能需要在服务器配置文件(如Tomcat的`server.xml`)中设置...

    图书管理系统基于servlet+mysql+jdbc+html.docx

    - **解决中文乱码问题**:统一使用UTF-8编码格式,确保中文字符正常显示。 #### 四、前端开发(HTML) - **基本组件使用**:HTML提供了丰富的标记语言,可以用来创建表单、超链接、表格等元素。 - **隐藏表单使用**...

Global site tag (gtag.js) - Google Analytics