一:filter(过滤器)
1.概念:过滤器(Filter)是一个能够拦截客户端与服务端请求和响应的web组件
2.web组件:servlet,filter,listener
3.作用:
①:拦截请求:在请求到达客户端要访问的web资源前拦截请求;
②:拦截响应:在响应到达客户端之前拦截响应;
4.应用场景:
①:过滤论坛中的非法字符
②:登录权限检查
③:统一处理项目中的中文乱码
5.过滤器开发入门
第一步:编写一个普通java类,实现Filter接口,重写doFilter方法;
第二步:在doFilter方法中处理被拦截的请求;
第三步:如果不进行拦截–在doFilter方法中调用chain.doFilter(request,response)即可;
第四步:①:在web.xml文件中配置Filter的类路径:
HelloFilter
com.heima.filter.HelloFilter
②:配置HelloFilter拦截的Servlet的映射路径:
HelloFilter
/helloServlet
6.Filter的生命周期
①:创建
②:执行过滤
③:销毁
7.Filter的映射路径
8.Filter的注解开发
第一步:创建一个普通的java类实现Filter接口,重写抽象方法;
第二步:在这个类上面使用@WebFilter注解进行映射路径的配置,如:@WebFilter(urlPatterns = “/demo”);
第三步:重写doFilter方法,进行具体的业务逻辑处理;
9.多个过滤器时,执行难顺序
①. xml配置方式的Filter,执行顺序按照在web.xml中配置的顺序,从上到下执行;
②.注解开发的Filter,执行的顺序是按照实现类的字母表顺序依次执行!
10.Filter应用案例
①:Filter统一解决post请求乱码问题
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 处理所有请求乱码和响应乱码
*/
@WebFilter(urlPatterns = "/*")
public class AEncodingFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//处理请求乱码
HttpServletRequest request = (HttpServletRequest) req;
String method = request.getMethod();
if ("post".equalsIgnoreCase(method)) {
request.setCharacterEncoding("UTF-8");
}
//处理响应乱码
resp.setContentType("text/html;charset=utf-8");
//放行
chain.doFilter(request, resp);
}
public void destroy() {
}
}
②:过滤器案例–登录权限校验
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter(urlPatterns = "/success.jsp")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//判断用户是否登录 获取session中的用户数据
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession();
User user = (User) session.getAttribute("loginUser");
if (null == user) {
//未登录 跳转到登录页面,并给出登录的提示信息
request.setAttribute("loginError", "请先登录!");
request.getRequestDispatcher("/login.jsp").forward(request, resp);
return;
}
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
二:listener(监听器)
1.概念:监听器用于监听对象的上的事件发生,在Servlet中监听器主要监听**请求对象(HttpServletRequest)、会话对象(Session)、上下文对象(ServletContext)**以及监听这些对象的作用域操作。
2.分类:(按照监听的内容)
①:监听域对象的:创建与销毁的;
②:监听域对象的:属性变化的。
3.ServletContextListener(创建和销毁)
- 编写一个监听器类去实现监听器接口
- 重写监听器的方法
- 需要在web.xml中进行配置(注册)–类路径
可以监听到创建和销毁的信息
4.HttpSessionListener
同上
5.ServletRequestListener
同上
=========================================
6.ServletContextAttibuteListener(属性变化) - 编写一个监听器类去实现监听器接口
- 重写监听器的方法
- 需要在web.xml中进行配置(注册)–类路径
- 可以监听到存值,设置值,删除值操作
7.HttpSessionAttributeListener监听器(同上)
ServletRequestAriibuteListenr监听器(同上)
8.应用场景
①:初始化的工作:初始化对象;初始化数据。比如加载数据库驱动,对连接池的初始化。
②:加载一些初始化的配置文件;比如spring的配置文件。
③:任务调度(定时器Timer/TimerTask)