1.什么是Filter
2.定义过滤器
(注意导的Filter的包来源是Javax.servlet)
/*
定义一个过滤器的步骤:
1. 自定义一个类实现Filter接口
2. 把过滤器规则定义在doFilter方法里面
3. 使用WebFilter注解配置过滤的路径
*/
//过滤的路径
//@WebFilter("/*") // /* 代表了拦截所有的路径,所有的请求过来都需要经过你的这个过滤器
public class Demo1Filter implements Filter {
/*
符合过滤路径的请求过来的时候都会执行doFilter方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("过滤器执行了......");
//放行,允许浏览器访问目标的资源
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
3.注意过滤器默认只拦截请求
更改拦截需要修改注解:
@WebFilter(value = "*.jsp",dispatcherTypes ={DispatcherType.FORWARD,DispatcherType.REQUEST} )
拦截的方式:
1. 过滤器默认情况只能拦截浏览器直接访问和请求重定向,对于通过请求转发的方式是没法拦截的
2. 如果需要拦截请求转发的需要使用dispatcherTypes配置。
3. 拦截方式主要有两种: request(默认) 与forward
拦截路径配置方式:
1, 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
2. 目录拦截:/user/:访问/user下的所有资源,都会被拦截
3. 后缀名拦截:.jsp:访问后缀名为jsp的资源,都会被拦截
4. 拦截所有:/*:访问所有资源,都会被拦截
注意: 不管servlet还是Filter路径的写法,除非是匹配后缀名是*开头,其他一律都需要/开头,否则报错。
如果有多个过滤器形成了过滤器链,执行的顺序取决于类名的顺序。比如Afilter会比Bfilter先执行
4.HttpServletRequest类型转换
request对象与response都是由tomcat服务器创建,而tomcat里面本质上创建的是HttpServletRequest与HttpServletResponse对象,
HttpServletRequest与ServletRequest之间关系是子父接口关系。 你们如果需要使用子接口特有的方法,完全可以强制类型转换
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//1. 为了能够使用子接口的特有的方法,强制类型转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//2、 获取当前用户的请求方式
String method = request.getMethod();
//3. 判断请求方式是否为get还是Post,如果是post需要解决请求参数的乱码问题
if("post".equalsIgnoreCase(method)){
request.setCharacterEncoding("utf-8");
}
//4. 设置响应乱码问题
response.setContentType("text/html;charset=utf-8");
//5. 最终放行
chain.doFilter(request,response);
}
5.从session里取值
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//1. 把request与response对象强制类型转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//2. 从session中去获取登录成功标记
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user==null){
//2. 如果还用户没有登录,跳转到登录页面
response.sendRedirect("/login.jsp");
}else{
//如果已经登录,直接放行
chain.doFilter(request,response);
}
}
6.Listener
/*
监听器定义步骤:
1. 自定义一个类实现对应监听器接口
*/
@WebListener
public class MyContextListener implements ServletContextListener {
/*
ServletContext什么创建? 什么时候销毁?
服务器启动的时候创建,服务器关闭的时候销毁
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("======ServletContext 创建的时候调用============");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("============ServletContext销毁的时候调用=========================");
}
}