EncodingFilter作用失效的问题(Java Web)

发布于 2021-12-03 06:34:53 字数 2691 浏览 922 评论 1

    项目是一个Spring MVC项目,配置了两个filter,配置如下所示:

<!-- 用于字符编码的filter -->
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>com.gpl.filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 用户身份验证filtera -->
	<filter>
		<filter-name>AuthenticationFilter</filter-name>
		<filter-class>com.gpl.filter.AuthenticationFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AuthenticationFilter</filter-name>
		<url-pattern>/api/*</url-pattern>
	</filter-mapping>
    两个filter的代码如下所示:

public class EncodingFilter implements Filter{

	private String encodeString = "utf-8";
	
	@Override
	public void destroy() {
		
	}


	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {
		request.setCharacterEncoding(encodeString);
//		response.setCharacterEncoding(encodeString);
		filterChain.doFilter(request, response);
		response.setCharacterEncoding(encodeString);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		
	}

}
public class AuthenticationFilter implements Filter{

	private String encodeString = "utf-8";

	//	@Resource(name="authenticationService")
	private AuthenticationService authenticationService = new AuthenticationServiceImpl();
	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain) throws IOException, ServletException {

		if(authenticationService.isLogin((HttpServletRequest)request)){
			filterChain.doFilter(request, response);
		}else{
			request.setCharacterEncoding(encodeString);
			response.setCharacterEncoding(encodeString);
			response.getWriter().print("请先登录。");
		}

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}
    如果尚未登陆,就会如代码所示,返回字符串“请先登录。”,但是该字符串是乱码,也只有这种情况,返回的中文变成了乱码,EncodingFilter已经设置好字符编码,为什么会这样呢?

    请知道的站友能说说,先谢了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情栀口红 2021-12-04 04:11:05

问题在于,客户端返回的编码不是utf-8编码,实际中,你不能假定客户端编码。应该首先判断request.getCharacterEncoding()是不是null,如果是null,表示客户端没有设置编码,你的编码过滤器应该尝试使用utf-8解析,由于客户端的不确定性,这个情况出现乱码是可以容忍的,没有办法完全解决这个问题。

如果request.getCharacterEncoding()不是null,表示客户端已经设置了编码,你就可以不需要设置编码格式,直接传递给filterChain就可以了。

Spring中解析核心代码如下:

protected void 
doFilterInternal ( HttpServletRequest request
                 , HttpServletResponse response
                 , FilterChain filterChain
                 )
throws ServletException
     , IOException
{
  if (    this.encoding != null 
       && (   this.forceEncoding 
           || request.getCharacterEncoding() == null
          )
     )
  {
    request.setCharacterEncoding(this.encoding);
    if (this.forceEncoding) {
      response.setCharacterEncoding(this.encoding);
    }
  }
  filterChain.doFilter(request, response);
}

this.encoding相当于你代码中的保存"utf-8"的变量,this.forceEncoding则表示是否需要强制按照指定编码解析请求和设置响应的编码。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文