使用过滤器解决字符编码问题
第一种方式:编码写到web.xml中,过滤器读取编码,设置到request对象即可
web.xml的文件:
<filter>
<filter-name>encoding</filter-name>
<filter-class>cn.itsource._02_encoding.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class EncodingFilter implements Filter {
private String charset = "UTF-8";//设置默认编码为UTF-8
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String tempCharset = filterConfig.getInitParameter("charset");
if(StringUtils.isNotBlank(tempCharset)){//判断 如果在配置文件中没有拿到charset
charset = tempCharset;
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//做字符编码过滤
request.setCharacterEncoding(charset);
chain.doFilter(request, response);//放行
}
@Override
public void destroy() {
}
}
web.xml文件:
<!-- 解决编码问题而配置的过滤器 -->
<filter>
<filter-name>charset</filter-name>
<filter-class>cn.itsource._04_encoding.CharsetFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<!-- force:强制 如果用户配置了这个值,那么代表全部强制使用我们设置的编码 -->
<param-name>force</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/**
* 解决字符编码问题的过滤器(配置版)
* */
public class CharsetFilter implements Filter {
private String charset = "UTF-8"; //设置默认编码为UTF-8
private Boolean force = false;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String tempCharset = filterConfig.getInitParameter("charset");
if(StringUtils.isNotBlank(tempCharset)){//判断如果在配置文件中没有拿到charset(tempCharset)
charset = tempCharset;
}
String tempDorce = filterConfig.getInitParameter("force");
if(StringUtils.isNotBlank(tempCharset)){
force = Boolean.valueOf(tempDorce);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//拿到相应的请求字符编码
String oldEncoding = request.getCharacterEncoding();
//如果请求中原本就带有编码,如何处理编码问题?
// 拿到原来的编码。如果存在,我们就不修改编码。如果不存在,就是用我们的编码格式
/**
* 在web.xml文件中,如果force的值为true,就一定会执行我们设置的编码
* 当force为false的时候,并且编码也没有值,也执行做字符编码过滤
*
* */
if(force || oldEncoding==null){
//做字符编码过滤
request.setCharacterEncoding(charset);
}
chain.doFilter(request, response);//放行
}
@Override
public void destroy() {
}
}