Struts2中解决POST请求和GET请求中的中文乱码问题

Java语言虽然天生支持国际化语言,但在项目实践中仍然会遇到中文乱码问题。

Struts2提供的默认过滤器虽然可在一定程度上支持编码处理,但过滤器的配置不当或JSP页面编码不当,中文乱码问题仍会出现。

最新的Tomcat(包括Tomcat6及以上版本)在对待POST请求和GET请求时的处理方式并不一致,请注意。

环境:Tomcat6.0 + MySQL 5 + Struts2        

编码:UTF-8

1.MySQL数据库编码

   对于MySQL中新创建的数据库采用UTF-8编码

 

2.Tomcat服务器设置

  在server.xml文件中配置Connector标签下的URIEncoding,server.xml在conf目录下

<connector connectiontimeout="20000"
          port="8080" protocol="HTTP/1.1" redirectport="8443" uriencoding="UTF-8">
</connector>

 

3.JSP页面编码

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

注意:pageEncoding和charset需要同时设置

 

4.在web.xml文件中配置struts2和编码相关的拦截器

<filter>  
    <filter-name>struts-cleanup </filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>struts-cleanup </filter-name>  
    <url-pattern>/* </url-pattern>  
</filter-mapping>

注意:这个拦截器要放置在默认拦截器之前才能对编码生效。

如果实现了以上4步基本就可以解决Struts2项目中的GET请求(不包括客户端Ajax的GET请求,如何处理Ajax请求中的乱码问题,请参考下篇博客)

对于POST请求,最常用的方法就是编写过滤器在过滤器中进行编码,接下来看如何使用过滤器来处理POST请求。

 

5.编写过滤器

假设过滤器类名为CharsetEncodingFilter,在filter的doFilter()方法中设置编码。encoding是filter配置中的参数,值是UTF-8。

@Override  
public void doFilter (ServletRequest sRequest, ServletResponse sResponse,  
        FilterChain filterChain ) throws IOException, ServletException  
{  
    HttpServletRequest request = (HttpServletRequest ) sRequest ;  
    HttpServletResponse response = (HttpServletResponse ) sResponse ;  
    // 设置字符集  
    request. setCharacterEncoding (encoding ) ;  
    response. setCharacterEncoding (encoding ) ;  
     
    filterChain. doFilter (request, response ) ;  
}  
 
@Override  
public void init (FilterConfig config ) throws ServletException  
{  
    encoding = config. getInitParameter ( &quot ;encoding &quot ; ) ;  
}

 

6.在web.xml文件中配置filter

<filter>  
    <filter-name>charsetEncoding </filter-name>  
    <filter-class>web.filter.CharsetEncodingFilter </filter-class>  
    <init-param>  
        <param-name>encoding </param-name>  
        <param-value>UTF-8 </param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>charsetEncoding </filter-name>  
    <url-pattern>/* </url-pattern>  
</filter-mapping>

在这里为filter设置了一个init-param,值为UTF-8(见第5步)

在这一步需要特别注意的是fiter配置放置的位置:需要放置在第4步中编码拦截器的前面。否则的话对于POST请求仍然会出现乱码。

因而最终的顺序如下:

<filter>  
    <filter-name>charsetEncoding </filter-name>  
    <filter-class>web.filter.CharsetEncodingFilter </filter-class>  
    <init-param>  
        <param-name>encoding </param-name>  
        <param-value>UTF-8 </param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>charsetEncoding </filter-name>  
    <url-pattern>/* </url-pattern>  
</filter-mapping>  
 
<filter>  
    <filter-name>struts-cleanup </filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>struts-cleanup </filter-name>  
    <url-pattern>/* </url-pattern>  
</filter-mapping>

经过以上6步处理后即可解决POST请求中的中文乱码问题。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Struts1框架来实现一个POST请求的HTTP接口,你需要按照以下步骤进行操作: 1. 首先,确保你已经将Struts1框架集成到你的项目。你可以在项目的依赖管理文件(比如Maven的pom.xml)添加Struts1相关的依赖项,然后执行相应的构建命令。 2. 在你的项目创建一个名为`user`的包,然后在该包下创建一个名为`AuthAction`的类。 3. 在`AuthAction`类添加一个名为`execute`的方法,并继承自`org.apache.struts.action.Action`类。例如: ```java package com.example.user; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 在这里编写处理POST请求的逻辑 return mapping.findForward("success"); } } ``` 4. 根据你的业务需求,在`execute`方法编写处理POST请求的逻辑。你可以通过`request`对象获取POST请求的参数,然后进行相应的处理。 5. 配置Struts的路由规则,将请求路径映射到`AuthAction`类的`execute`方法。在struts-config.xml配置文件,添加如下配置: ```xml <action path="/user/auth" type="com.example.user.AuthAction" name="authForm" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> </action> ``` 这里,我们将请求路径为`/user/auth`的POST请求映射到`AuthAction`类的`execute`方法,并将执行结果转发到名为`success`的页面。 6. 确保你的项目已经正确配置Struts1框架的相关配置文件,比如struts-config.xml等。 这样,当有POST请求发送到`/user/auth`路径时,Struts1框架将会调用`AuthAction`类的`execute`方法,并执行处理POST请求的逻辑。最后,根据配置的转发规则,将结果返回给客户端。 请注意,以上步骤是一般的示例,实际应用可能需要根据具体需求进行适当调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值