Filter和Listener学习笔记

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销毁的时候调用=========================");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值