Filter
filter在web组件中负责拦截客户端对于服务器任何(1:已存在资源 2:未存在资源)资源的访问, 拦截以后根据定义的规则判断是否需要放行!
生命周期
package com.javakc.web1.filter;
import javax.servlet.*;
import java.io.IOException;
//生命周期
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截");
}
@Override
public void destroy() {
System.out.println("销毁");
}
}
web.xml
<!--拦截-->
<filter>
<filter-name>CustomFilter</filter-name>
<filter-class>com.javakc.web1.filter.CustomFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CustomFilter</filter-name>
<!--拦截指定的路径-->
<!--<url-pattern>/user.do</url-pattern>-->
<!--拦截指定的后缀-->
<!--<url-pattern>*.do</url-pattern>-->
<!--拦截所有请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
单个过滤器方法
重定向方法
package com.javakc.web1.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//单个过滤器方法
public class CustomFilter1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取到HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
//获取到HttpServletResponse
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取客户端当前访问的资源
String uri = request.getRequestURI();
//重定向方法
if (uri.contains("/login.html")) {
//通知过滤器链放行
filterChain.doFilter(servletRequest, servletResponse);
} else {
response.sendRedirect(request.getContextPath() + "/login.html");
}
}
}
多个过滤器
package com.javakc.web1.filter;
import javax.servlet.*;
import java.io.IOException;
//多个过滤器
public class CustomFilter2 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("CustomFilter2 before");
//通知过滤器链放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("CustomFilter2 after");
}
}
package com.javakc.web1.filter;
import javax.servlet.*;
import java.io.IOException;
public class CustomFilter3 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("CustomFilter3 before");
//通知过滤器链放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("CustomFilter3 after");
}
}
package com.javakc.web1.filter;
import javax.servlet.*;
import java.io.IOException;
//多个过滤器
public class CustomFilter4 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("CustomFilter4 before");
//通知过滤器链放行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("CustomFilter4 after");
}
}
web.xml
<!--多个拦截-->
<filter>
<filter-name>CustomFilter2</filter-name>
<filter-class>com.javakc.web1.filter.CustomFilter2</filter-class>
</filter>
<filter>
<filter-name>CustomFilter3</filter-name>
<filter-class>com.javakc.web1.filter.CustomFilter3</filter-class>
</filter>
<filter>
<filter-name>CustomFilter4</filter-name>
<filter-class>com.javakc.web1.filter.CustomFilter4</filter-class>
</filter>
<!--决定拦截顺序-->
<filter-mapping>
<filter-name>CustomFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CustomFilter3</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CustomFilter4</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
运行结果:
CustomFilter2 before
CustomFilter3 before
CustomFilter4 before
CustomFilter4 after
CustomFilter3 after
CustomFilter2 after
含有多个过滤器的分发器
package com.javakc.web1.user;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//分发器重定向
public class UserServlet8 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//分发器跳转页面
request.getRequestDispatcher("/success.html").forward(request, response);
}
}
运行结果:
CustomFilter2 before
CustomFilter3 before
CustomFilter4 before
CustomFilter4 after
CustomFilter3 after
CustomFilter2 after
含有多个过滤器的重定向
package com.javakc.web1.user;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//分发器重定向
public class UserServlet8 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向跳转
response.sendRedirect(request.getContextPath() + "/success1.html");
}
}
CustomFilter2 before
CustomFilter3 before
CustomFilter4 before
CustomFilter4 after
CustomFilter3 after
CustomFilter2 after
CustomFilter2 before
CustomFilter3 before
CustomFilter4 before
CustomFilter4 after
CustomFilter3 after
CustomFilter2 after
注解
servlet
@WebServlet(
name = "UserServlet",
urlPatterns = "/user.do",
loadOnStartup = 0,
initParams = {
@WebInitParam(
name = "username",
value = "administrator"
),
@WebInitParam(
name = "password",
value = "123456"
)
}
)
Filter
单个urlPatterns
@WebFilter(
filterName = "CustomFilter1",
urlPatterns = "/*"
)
多个urlPatterns
@WebFilter(
filterName = "CustomFilter1",
urlPatterns = {
"*.js", "*.html"
}
)
多个过滤器顺序:按照类名排序