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

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

 

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

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

第一步:web

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

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

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

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

好了,第一步輕鬆解決。準備開始第二步,可是在第二步以前,先說明一下。tomcat

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>

相關文章
相關標籤/搜索