javaweb的三大组件之一。
Filter过滤器(/拦截器)是在URL对一组资源(servlet,html,jsp,css,js,jpg等)的请求之前,当满足条件后发行。
- default void init(FilterConfig filterConfig)
- void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
- default void destroy()
- public FilterConfig getFilterConfig()
- public ServletContext getServletContext()
- public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.init();
} - public void init() throws ServletException
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ this.doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);}
- protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response); //放行
}
因此我们可以参照Servlet方法,继承HttpFilter即可,重写其中的doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)方法。
Filter的执行过程:
Filter的执行顺序:
注解方式:
@WebFilter(filterName = "RequestFilter",urlPatterns = "/*",dispatcherTypes = {DispatcherType.REQUEST})
拦截方式
在web.xml中设置错误页
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
测试代码:
1.MyServlet AbsServlet见上篇
@WebServlet(name = "MyServlet",urlPatterns = {"/error","/add","/delete"})
public class MyServlet extends AbsServlet {
public String add(HttpServletRequest req,HttpServletResponse res){
System.out.println("this is add");
//转发
return "forward:/delete";
}
public String delete(HttpServletRequest req,HttpServletResponse res){
System.out.println("this is delete");
return "这是this is delete";
}
public void error (HttpServletRequest req,HttpServletResponse res)throws Exception {
//错误重定向到错误页
System.out.println("this is error");
res.sendRedirect(req.getContextPath()+"/404.html");
}
}
2.ForwardFilter
//转发至/delete的请求进行拦截
@WebFilter(filterName = "ForwardFilter",urlPatterns = "/delete", dispatcherTypes = {DispatcherType.FORWARD})
public class ForwardFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FORWARD Filter");
chain.doFilter(request,response);
}
}
3.ErrorFilter
//错误拦截,错误页在web.xml中设置
@WebFilter(filterName = "ErrorFilter",urlPatterns = "/*", dispatcherTypes = {DispatcherType.ERROR})
public class ErrorFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Error Filter");
chain.doFilter(request,response);
}
}
4.EncodingFilter
//拦截所有请求进行编码设计,为保证为第一个拦截器,在filterName前加了AAA
//DispatcherType.REQUEST为默认方式,可以不设置
@WebFilter(filterName = "AAAEncodingFilter",urlPatterns = "/*", dispatcherTypes={DispatcherType.REQUEST})
public class EncodingFilter extends HttpFilter {
@Override public void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("EncodingFilter");
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
chain.doFilter(req, resp);
}
}
5.web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<error-page>
<!--错误编码404,错误页404.html-->
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
</web-app>
当浏览器进行:http: //localhost:8088/javaweb/add 时,会转发请求/delete,同时执行拦截器ForwardFilter
http: //localhost:8088/javaweb/add1 /add1不存在,执行错误拦截器ErrorFilter,转向错误页面404.html
关于编码的设置
//自定义类将HttpRequest进行包装,更新方法getParameter
//方法getParameter重写req.getMethod为get方式时的转换
public class EncodingRequest extends HttpServletRequestWrapper{
private HttpServletRequest req = null;
public EncodingRequest(HttpServletRequest req) {
super(req);
this.req = req;
}
@Override
public String getParameter(String s) {
String result = req.getParameter(s);
try {
result = new String(result.getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
}
@WebFilter(filterName = "AAAEncodingFilter",urlPatterns = "/*", dispatcherTypes={DispatcherType.REQUEST})
public class EncodingFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException {
//请求为post和请求为get时的编码设置
if(req.getMethod().equals("post")){
req.setCharacterEncoding("utf-8");
} else if (req.getMethod().equals("get")) {
//req转为EncodingRequest类型,执行的是自定义类中的方法
req = (EncodingRequest)req;
}
System.out.println("EncodingFilter");
//响应编码
resp.setContentType("text/html;charset=utf-8");
chain.doFilter(req, resp);
}
}