filter过滤器是Java EE的规范,作用是:拦截请求,过滤响应。
拦截请求的常见场景:
- 权限检查。
- 日志操作。
- 事务管理。
- 等等
演示fiter过滤器权限限制,只有登录后才有权限进行访问a目录下的资源
代码:
//拦截器的实现类
public class FitlerServlet1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//拦截器的初始化方法
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//这个方法是进行拦截后的操作
HttpServletRequest servletRequest1 = (HttpServletRequest) servletRequest;
HttpSession session = servletRequest1.getSession();
String id = session.getId();
Object ssss = session.getAttribute(id);
if (ssss!=null){
//验证成功
filterChain.doFilter(servletRequest,servletResponse);
servletRequest1.getRequestDispatcher("/a/a.jsp").forward(servletRequest,servletResponse);
}else{
//验证失败
System.out.println("跳转到登陆页面");
}
}
@Override
public void destroy() {
}
}
//登录信息验证的servlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
String id = session.getId(); //获取sessionId 来实现多用户登录
String suername = req.getParameter("suername");
String password = req.getParameter("password");
if ("链接数据库的信息".equals(suername)&&"链接数据库的信息".equals(password)){
//验证账号密码成功
req.setAttribute(id,"验证成功");
}
}
}
在web.xml中进行配置:
<!--用于配置一个Filter过滤器-->
<filter>
<!-- 别名-->
<filter-name>filter</filter-name>
<!-- 过滤器地址-->
<filter-class>com.atguigu.servlet.fitler.FitlerServlet</filter-class>
<!--过滤器初始化的信息-->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 选择那个过滤器进行使用-->
<filter-name>filter</filter-name>
<!-- 要进行过滤的内容-->
<url-pattern>/a/x.jsp</url-pattern>
</filter-mapping>
FilterConfig类
是Filter的配置文件类,服务器每次创建Filter类的时候也会创建一个FilterConfig的类,这里包含了Filter过滤器的所有信息。
直接上代码:
public FitlerServlet(){
System.out.println("构造器方法");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("fitle初始化的方法");
System.out.println(filterConfig.getFilterName());//是用来获取别名
System.out.println(filterConfig.getInitParameter("username"));//是用来获取配置文件中指定的初始化参数
System.out.println(filterConfig.getInitParameterNames());//是用来获取初始化参数的所有的名称和值,存放在一个集合中,遍历的时候一个一个的枚举出来
ServletContext servletContext = filterConfig.getServletContext();//用来获取servletcontext对象
}
FilterChain过滤器链
流程:
例一:
运行结果是:
例二:
运行结果是:
Filter过滤器链的执行顺序是 :
在多个Filter过滤器执行的时候,他们执行的优先级顺序是由他们在web.xml中从上到下的配置顺序来执行的。