过滤器的作用
执行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter
可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验
编写过滤器
Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)
Filter过滤器的配置方法
1.web.xml配置
<filter>
<filter-name>aaFilter</filter-name>
<filter-class>com.qianfeng.filter.AAFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>aaFilter</filter-name>
<url-pattern>/aa</url-pattern>
</filter-mapping>
<!--配合和注解两种形式去配置过滤器
web.xml配置是优先于注解执行的 在web.xml中 按照顺序 先配置的先执行
注解中 按照过滤器类名的自然顺序执行
-->
<!--配合和注解两种形式去配置过滤器
web.xml配置是优先于注解执行的 在web.xml中 按照顺序 先配置的先执行
注解中 按照过滤器类名的自然顺序执行
-->
2.注解配置 :WebFilter("/aa")
Filter实现过程
@WebFilter("/aa")
public class AAFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("前置过滤");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("后置过滤");
}
@Override
public void destroy() {
}
}
@WebServlet("/aa")
public class AAServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet执行了");
}
}
Servlet和Filter的配置路径必须一样,上图执行顺序,前置过滤--servlet执行了--后置过滤。
Filter登录验证原理
//@WebFilter(urlPatterns = {"/bb","/cc","/dd"})
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user!=null){//已经登陆了
filterChain.doFilter(servletRequest,servletResponse);
}else{
response.sendRedirect("login.html");
}
}
@Override
public void destroy() {
}
}
@WebFilter(urlPatterns = {"/bb","/cc","/dd"})表示可以过滤多个请求。
过滤器的过滤路径的三种形式
过滤器的过滤路径通常有三种形式:
精确过滤匹配 ,比如/index.jsp /myservlet1
后缀过滤匹配,比如*.jsp、*.html、*.jpg
通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
/aaa/bbb/* 允许
过滤器优先级
在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 优先级:
如果为注解的话,是按照类全名称的字符串顺序决定作用顺序
如果web.xml,按照 filter-mapping注册顺序,从上往下
web.xml配置高于注解方式
如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多