目录
一、Filter
1.概述
Filter 表示过滤器,是JavaWeb 三大组件(Servlet、Filter、Listener)之一
2.作用
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,
过滤器一般完成一些通用的操作,比如:
-
权限控制
-
统一编码处理
-
敏感字符处理
-
...
3.快速入门
-
定义类,实现Filter接口并重写所有方法
-
配置Filter拦截资源路径:在类上定义@WebFilter注解
-
在doFilter方法中输出一句话并放行filterChain.doFilter(request,response)
@WebFilter("/*")
public class FilterDemo 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("FilterDemo");
//放行
filterChain.doFilter(servletRequest,servletResponse);
//放行后
}
@Override
public void destroy() {
}
}
4.执行流程
放行后访问对应资源,资源访问完成后,还会回到Filter中,执行放行后逻辑代码
-
执行放行前逻辑:request数据处理
-
放行
-
访问资源
-
回到filter,执行放行后逻辑:response数据处理
5.拦截路径配置
-
拦截具体的资源:/indexjsp
只有访问index.jsp时才会被拦截。
-
目录拦截:/user/*
访问/user下的所有资源,都会被拦截
-
后缀名拦截:* .jsp
访问后缀名为jsp的资源,都会被拦截
-
拦截所有:/*
访问所有资源,都会被拦截
6.拦截器链(多个过滤器)
一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序
7.登录验证
如果没有登录,无法访问某些资源
如果登录过,则正常显示
filter:
package com.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
//判断访问的资源是否和登录或注册相关
//登录和注册相关的图片,css,js,Servlet等
String[] urls = {"/login_register","/checkCode","/login","/register"};
final String u = request.getRequestURL().toString();
System.out.println("请求路径:"+u);
// filterChain.doFilter(servletRequest,servletResponse);
for (String url : urls) {
if (u.contains(url)){
System.out.println(u+":放行");
filterChain.doFilter(servletRequest,servletResponse);
return;
}
}
// 判断session是否有user
final HttpSession session = request.getSession();
final Object user = session.getAttribute("user");
System.out.println(user);
if (user != null){
//System.out.println("user:"+user);
filterChain.doFilter(servletRequest,servletResponse);
}else {
request.setAttribute("Msg","尚未登录");
request.getRequestDispatcher("/jsp/login_register/login_and_sigin.jsp").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
二、Listener(了解即可)
1.概述
Listener 表示监听器,是JavaWeb 三大组件(Servlet、Filter、Listener)之一。
2.主要作用
监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件
3.分类
-
ServletContext监听
监听器名称 | 作用 |
---|---|
ServletContextListener | 用于对Servletcontext对象进行监听(创建、销毁) |
ServletContextAttributeListener | 对Servletcontext对象中属性的监听(增删改属性) |
-
Session监听
监听器名称 | 作用 |
---|---|
HttpSessionListener | 对Session对象的整体状态的监听(创建、销毁) |
HttpSessionAttributeListener | 对Session对象中的属性监听(增删改属性) |
HttpSessionBindingListener | 监听对象于Session的绑定和解除 |
HttpSessionActivationListener | 对Session数据的钝化和活化的监听 |
-
Request监听
监听器名称 | 作用 |
---|---|
ServletRequestListener | 对Request对象进行监听(创建、销毁) |
ServletRequestAttributeListener | 对Request对象中属性的监听(增删改属性) |
4.快速入门
-
定义类,实现ServletContextListener接口
-
在该类上添加@WebListener注解,不需要配路径
package com.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
//servletContext被创建:整个web应用加载成功
//加载资源
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
//servletContext被销毁:整个web应用卸载成功
//释放资源
}
}