天天看點

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

資料庫進出的資料,我們暫時不去管它,我們先解決頁面到程式的亂碼問題,後面那都是後話。

第一步:

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

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

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

其中pageEncoding="UTF-8"是解決頁面java代碼子產品編碼,contentType="text/html; charset=UTF-8"是解決頁面靜态部分的編碼。

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

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>

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

   }

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

   public void destroy() {

       config = null;

       encoding = null;

}

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

          <filter-name>encodeFilter</filter-name>

          <filter-class>com.org.midland.common.EncodeFilter</filter-class>

          <init-param>

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

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

          </init-param>

          <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="UTF-8""變成下面的樣子

              redirectPort="8443"

              URIEncoding="UTF-8"" />

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

三步搞定一切亂碼。

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

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

    可是通過将參數放置在url中,背景接收的中文是亂碼  看到這篇文章後 嘗試将jboss的server.xml中添加配置項  URIEncoding="UTF-8"  重新開機jboss後  亂碼問題搞定

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

  web.xml中的配置

       <!-- Struts2 Configuration -->

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

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

<!-- Spring Encoding 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>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>