struts2.3.35更改默认编码格式,解决前台jsp传后台action的中文乱码问题

struts2更改默认编码格式,解决前台传后台的中文乱码问题

虽然可以页面用url编码器编码 ,后台用url解码器解码,但是更改量太大,本文不做细说,大概实现为:

//前端js用encodeURI函数转换
例:var a = encodeURI(encodeURI(name));
//后端用URLDecoder类转换
例:String name = request.getParameter("a");
System.out.println("前台传入参数:" + name);
name = URLDecoder.decode(name,"UTF-8");

本文主要解决的是基于struts2-core-2.3.35.jar的版本,更改jar包中的默认编码格式,根据系统调整。解决思路就是重写StrutsPrepareAndExecuteFilter类。
首先看web.xml中的配置

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
		</filter-class>
	</filter>

更改后

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			com.sinosig.rsa.encodingFilter.StrutsPrepareAndExecuteFilter
		</filter-class>
	</filter>

重写的类:重点是request.setCharacterEncoding(“GBK”); 这里将编码改为系统的编码即可。

package com.sinosig.rsa.encodingFilter;

import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;

import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.LocalizedTextUtil;

public class StrutsPrepareAndExecuteFilter
  implements StrutsStatics, Filter
{
  protected PrepareOperations prepare;
  protected ExecuteOperations execute;
  protected List<Pattern> excludedPatterns;

  
  public StrutsPrepareAndExecuteFilter()
  {
    this.excludedPatterns = null;
  }
  public void init(FilterConfig filterConfig) throws ServletException {
    InitOperations init = new InitOperations();
    Dispatcher dispatcher = null;
    try {
      FilterHostConfig config = new FilterHostConfig(filterConfig);
      init.initLogging(config);
      dispatcher = init.initDispatcher(config);
      init.initStaticContentLoader(config, dispatcher);

      this.prepare = new PrepareOperations(dispatcher);
      this.execute = new ExecuteOperations(dispatcher);
      this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

      postInit(dispatcher, filterConfig);
    } finally {
      if (dispatcher != null) {
        dispatcher.cleanUpAfterInit();
      }
      init.cleanup();
    }
  }

  protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig)
  {
  }

  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException
  {
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)res;
    try
    {
      if ((this.excludedPatterns != null) && (this.prepare.isUrlExcluded(request, this.excludedPatterns))) {
        chain.doFilter(request, response);
      } else {
        this.prepare.setEncodingAndLocale(request, response);
        //add by  更改struts2的默认编码格式 begin 
        request.setCharacterEncoding("GBK");
        //add by  更改struts2的默认编码格式 end
        this.prepare.createActionContext(request, response);
        this.prepare.assignDispatcherToThread();
        request = this.prepare.wrapRequest(request);
        ActionMapping mapping = this.prepare.findActionMapping(request, response, true);
        if (mapping == null) {
          boolean handled = this.execute.executeStaticResourceRequest(request, response);
          if (!handled)
            chain.doFilter(request, response);
        }
        else {
          this.execute.executeAction(request, response, mapping);
        }
      }
    } finally {
      this.prepare.cleanupRequest(request);
    }
  }

  public void destroy() {
    this.prepare.cleanupDispatcher();
  }
}

这样即可。

对于低版本的 可以在dispatcher过滤器中 加上初始参数:

 <init-param> 
 <param-name>struts.i18n.encoding</param-name> 
 <param-value>utf-8</param-value>//这里面的内容可供用户自己填写(必须是编码格式) 
 </init-param>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值