过滤器Filter
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理
应用到的场景一般有自动登录、统一设置编码格式、访问权限控制和敏感字符过滤等
在我的项目中,新建一个角色
王五
会出现乱码
数据库中也显示乱码
这就是由于没有设置过滤器导致,所以需要设置过滤器来解决
首先在数据库连接的bd中设置字符编码
String DB_URL ="jdbc:mysql://localhost:3306/test?useUnicode=true";
告诉MySQL这里要用到我们自己定义的编码,而非系统自带的编码(如ios等)
然后修改Tomcat,在conf目录的service.xml文件中修改connecter
Tomcat如果不作这一步修改,在以后的项目中会遇到本电脑显示正常,项目到其他电脑就显示乱码的情况
在servlet中新建EncodeFilter
public class EncodeFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
在web.xml中配置filter
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>com.dpb.servlet.servlet.EncodeFilter</filter-class> //这里是servlet的路径
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>//“/*”的意义是所有文件编码都要经过此过滤
</filter-mapping>
编写filter
private String encode = "utf-8";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
if (filterConfig.getInitParameter("encode") != null) {
encode = filterConfig.getInitParameter("encode");
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding(encode);
response.setCharacterEncoding(encode);
filterChain.doFilter(request, response);
(加粗部分是filter的核心编码,即实现request和response的互相转换)
再次添加的新用户角色不再产生乱码,数据库中也不再显示乱码