(轉)struts2.2.3 配置中文亂碼攔截過濾器 解決接收中文參數亂碼問題


  一個項目中碰到亂碼的問題了,只用到struts2,就是前台輸入中文,后台解析參數發生了亂碼,在網上找到了這篇文章,特此轉載。經測試,真實有用。。

 

java 編程中得中文亂碼問題,一直都是個困擾程序員的問題。

數據庫進出的數據,我們暫時不去管它,我們先解決頁面到程序的亂碼問題,后面那都是后話。

第一步:

jsp頁面編碼統一問題,這個最容易解決。

<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=GBK"%>

以GBK為例子,jsp頁面加上上面一句就能解決頁面編碼問題。

其中pageEncoding="GBK"是解決頁面java代碼模塊編碼,contentType="text/html; charset=GBK"是解決頁面靜態部分的編碼。

好了,第一步輕松解決。准備開始第二步,但是在第二步之前,先說明一下。

jsp的操作流程,是jsp接受各種請求,然后轉給servlet處理。在這個過程中會有中文亂碼產生。知道了這個亂碼產生的原因,就容易辦了,接下來就是第二步了。

第二步:

我這里用到了Struts2.2.3,目前較新版本吧。我們到知道,struts2封裝了servlet,由action來處理jsp的頁面請求。

既然用到了struts2,我們的web.xml肯定配置了struts2的攔截器。配置代碼如下:

<filter>
          <filter-name>struts2</filter-name>
          <filter-class>
              org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
          </filter-class>
</filter>
<filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
</filter-mapping>  

這段是攔截所有請求交給struts2去處理。但是編碼問題怎么解決?別急,接着看。

手寫個字符編碼過濾器的類。代碼如下:

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.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;

public class EncodeFilter extends StrutsPrepareAndExecuteFilter implements Filter  {
    private FilterConfig config = null;
    private String encoding = null;
    
    @Override
    public void init(FilterConfig config) throws ServletException {
       this.config = config;
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) throws IOException, ServletException {
        if (encoding == null) {
            encoding = config.getInitParameter("encoding");
           }
           request.setCharacterEncoding(encoding);
           response.setCharacterEncoding(encoding);
           chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        config = null;
        encoding = null;
    }
}

過濾器的類寫好了,肯定要配置到web.xml中去得。於是在web.xml配置文件中加入下列代碼。

<filter>
           <filter-name>encodeFilter</filter-name>
           <filter-class>com.org.midland.common.EncodeFilter</filter-class>
           <init-param>
               <param-name>encoding</param-name>
               <param-value>GBK</param-value>
           </init-param>
</filter>
<filter-mapping>
           <filter-name>encodeFilter</filter-name>
           <url-pattern>/*</url-pattern>
</filter-mapping>

ok,第二步到這里就完成了。jsp頁面進行表單提交的時候是不是沒有亂碼了?怎么?還有亂碼?是的,因為還有最后一步。

以上兩步,在表單做post提交的時候是沒有亂碼問題的。但是如果表單做get提交就會有亂碼。還有url帶參數的請求都還有中文亂碼問題。這要怎么解決?不急,還有第三步,下面開始第三步。

第三步:

配置應用服務器的編碼,這里以tomcat為例子。找到server.xml這個配置文件,並在該文件中找到如下位置:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"/>

在這里面加入URIEncoding="GBK"變成下面的樣子

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="GBK" />

好了,服務器編碼已經解決了。服務跑起來,看看還有沒有中文亂碼問題?沒有了吧。

三步搞定一切亂碼。

--------------------------------------------------

說明 :我用的時struts2.2.3+spring   其實spring有自帶的過濾器  並且已經配置了,這個就可以解決表單以post方式提交的中文亂碼問題。

    可是通過將參數放置在url中,后台接收的中文是亂碼  看到這篇文章后 嘗試將jboss的server.xml中添加配置項  URIEncoding="GBK"  重啟jboss后  亂碼問題搞定

   在測試過程中發現 啟動服務后 先走了是struts的過濾器 然后才走的Spring的過濾器 ,這個執行順序跟你在web.xml中配置配置這兩個過濾器的先后順序沒關系。

  web.xml中的配置

       <!-- Struts2 Configuration -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


<!-- Spring Encoding filter -->
<filter>
<filter-name>Spring character encoding filter</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>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Spring character encoding filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM