EncodingFilter作用失效的问题(Java Web)
项目是一个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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题在于,客户端返回的编码不是utf-8编码,实际中,你不能假定客户端编码。应该首先判断request.getCharacterEncoding()是不是null,如果是null,表示客户端没有设置编码,你的编码过滤器应该尝试使用utf-8解析,由于客户端的不确定性,这个情况出现乱码是可以容忍的,没有办法完全解决这个问题。
如果request.getCharacterEncoding()不是null,表示客户端已经设置了编码,你就可以不需要设置编码格式,直接传递给filterChain就可以了。
Spring中解析核心代码如下:
this.encoding相当于你代码中的保存"utf-8"的变量,this.forceEncoding则表示是否需要强制按照指定编码解析请求和设置响应的编码。