Filter中文编码过滤器
编码过后将有关内容进行讨论:
ps:idea注解配置Filter时,并不会指定过滤路径,但是可以用urlPatterns指定
package wonderful;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author :wonderful_wzf
* @message:Filter中文编码过滤器
* @Bolg :https://blog.csdn.net/wonderful_wzf
* @date :2020/5/19,20:32
*/
@WebFilter(filterName = "EncodingFilter",urlPatterns = "/*")
public class EncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//强转
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//请求设置编码格式 浏览器到服务器
request.setCharacterEncoding("utf-8");
//防止中文乱码 设置响应编码 服务器到浏览器
response.setContentType("text/html;charset=UTF-8");
//放行
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) {
}
}
大概懂这个功能,但是对有关问题还是有点疑惑
a.为什么要将ServletRequest,ServletResponse强转成HttpServletRequest,HttpServletResponse
ServletRequest request;这个是将子类对象赋给父类引用,他运行时的类型是子类,编译时的类型是父类,但是在运行时,父类类型对象调用的方法如果子类里面有,那就执行子类里面的方法,如果编译时的类型也就是父类没有调用的那个方法,则报错。所以在那里要做一个强制类型转换,否则就会报错
b.关于Filter中ServletRequest和ServletResponse强转HttpServletRequest和HttpServletResponse安全问题(向下转型一定不安全吗?)
点击参考文章查看;
对上转型和下转型对象好好理解!
3.web.xml里面的Filter按从上到下执行,如果注解配置Filter多了会是怎样执行呢(Filter不按顺序执行可能会出现看不懂的错误,切记;ps:今天老师在配置Servlet,Filter,Listener时顺序错了,找不着头脑~~)
点击参考文章查看;
不积跬步无以至千里,不积小流无以成江海;
一步一个脚印,多思考为什么?一起加油!