摘要:本文将介绍Servlet中的过滤器Filter对所有的Servlet类进行编码过滤,并讲解一些对Servlet类进行编码过滤,但是不生效时可能的原因。
1. 编码过滤器的编写:定义一个实现Filter接口的类,重写doFilter方法,在该doFilter方法设置请求和响应对象的编码,防止后续中的乱码情况。下面的例子中,我将讲解:编码过滤器EncodingFilter对Servlet的实现类SelectBookInfoServlet进行过滤。
// EncodingFilter类:过滤器
// 编码过滤器
// @WebFilter("*.do"):这里表示的是对以 .do 为后缀的文件进行过滤(编码过滤)
@WebFilter("*.do")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
// 对请求的数据设置编码,以防乱码的情况
request.setCharacterEncoding("UTF-8");
// 对响应的数据设置编码,防止渲染的页面的数据发生乱码
response.setContentType("text/html;charset=UTF-8");
// 过滤放行
filterChain.doFilter(request,response);
}
}
// SelectBookInfoServlet类:被过滤的对象
// 注意: @WebServlet中的字符串内容一定要以 .do 为后缀,这样也可以识别Servlet资源,方便设置Servlet的编码进行过滤。
@WebServlet("/book/SelectBookInfoServlet.do")
public class SelectBookInfoServlet extends HttpServlet {
private BookService bookService = new BookServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取参数
String bid = req.getParameter("bid");
// 查询数据库的数据
Book bookByBid = bookService.findBookByBid(bid);
System.out.println("查询数据库的数据:");
System.out.println(bookByBid);
// JSON化
String value = JSON.toJSONString(bookByBid);
// 响应数据
PrintWriter pw = resp.getWriter();
pw.write(value);
pw.close();
}
}
2. Servlet实现类使用了过滤器,但是过滤器不生效的原因:(大部分原因是过滤器写错了)
1)请检查这个@WebFilter("*.do")注解是否正确?
过滤器Filter的实现类的注解一定是@WebFilter,不要写成了@WebServlet注解,@WebServlet是对控制器Servlet的实现类进行的注解。
2)请检查这个@WebFilter("*.do")注解中的需要过滤的文件是否正确?这里表示的是对 .do 为后缀的文件进行过滤。
3)请检查你需要过滤的文件是否在你编写的过滤器的文件范围内?由于上述中我编写的过滤器是针对以.do为后缀的文件进行过滤的,在我需要过滤的文件中添加了.do为后缀的注解,所以我需要进行过滤的SelectBookInfoServlet类是在我编写的EncodingFilter类过滤的文件的范围之内的。