小白初学JSP_2(Filter过滤器,Listener监听器、登入案例)

Servlet、Filter、Listener为JavaWeb的三大组件

一、Filter:过滤器

1.1 概念

  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
  • 过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤。

1.2 快速入门

  1. 步骤:
    1. 定义一个类,实现Filter接口
    2. 复写方法
    3. 配置要拦截的路径(两种配置方法)
      1.           方法一:配置web.xml文件
                  方法二:注解配置。 @WebFilter(value="/*")里面为要拦截的路径

1.3 过滤器细节

1.3.1 web.xml配置(和Servlet差不多一样)

    <filter>
        <filter-name>FileDemo</filter-name>
        <filter-class>cn.itcast.web.filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
         <!-- 映射名称 -->
        <filter-name>FileDemo</filter-name>
        <!-- 拦截路径 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 
 

    1.3.2 过滤器执行流程

    1. tomcat引擎将客户端浏览器的http请求转成request对象,http响应转response对象
    2. 地址符合过滤的条件,则将request,resposne传给过滤器的doFilter方法
    3. 执行chain.doFilter(request,response)方法前的代码(对请求消息增强),并且传给该方法进行放行
    4. 再传给Serclet对象的doGet或者doPost方法,进行对response响应对象进行设置,或者调用相应的资源
    5. doFilter再执行剩余代码之后(对reponse进行增强),reponse再返回浏览器 设置编码的代码位置
    6. doFilter之前设置增强请求编码,之后设置增强响应编码

    1.3.3 过滤器生命周期方法(Filter接口中的方法)

    1. init方法:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。
    2. doFilter方法:每一次请求被拦截资源时,会执行。执行多次。(里面的两个形参都是Servlet对象,一般都转化为HttpServlet对象在使用)
    3. destroy方法:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行该方法。只执行一次。用于释放资源。

    1.3.4 过滤器配置详解

    1. 拦截路径的配置
      1. 具体资源路径:/index.jsp,只有访问index.jsp,过滤器才会被执行。
      2. 目录拦截:/user/*,访问/user下的所有资源时,过滤器都会被执行
      3. 后缀名拦截:*.jsp,访问所有后缀名为jsp的资源时,过滤器都会被执行。
      4. 拦截所有资源:/*,访问所有资源时,过滤器都会被执行
    2. 拦截方式的配置:资源被访问的方式
      1. 注解配置
        1.          设置 注解的dispatcherType属性@WebFilter(value="/index.jsp", dispatcherTypes = {DispatcherType.FORWARD, DispatcherType.REQUEST})可拦截多种方式, dispatcherTypes属性中以数组形式保存,有5个可选值 :
          1. REQUEST:默认值。浏览器直接请求资源时,过滤器才会被执行
          2. FORWARD:转发访问资源时,过滤器才会被执行
          3. INCLUDE:包含访问资源时,过滤器才会被执行
          4. ERROR:错误跳转资源时,过滤器才会被执行
          5. ASYNC:异步访问资源时,过滤器才会被执行
      2. web.xml配置
        •         设置 <dispatcher></dispatcher>标签,同上5个值

    1.3.5 过滤器链(配置多个过滤器)

    • 执行顺序:如果有两个过滤器:过滤器1和过滤器2
      1. 过滤器1
      2. 过滤器2
      3. 资源执行
      4. 过滤器2
      5. 过滤器1
    • 过滤器的先后顺序问题:
      1. 注解配置:按照类名的字符串比较规则,值小的先执行
        •       如: AFilterBFilter,A小,先执行
      2. web.xml:<filter-mapping></filter-mapping>谁映射定义在上面,谁先执行
    (在以后对于怎么对request和response的增强???已经有前辈给我们做好了通用的模式:设计模式)

    二、Listener:监听器

    2.1 概念

    • web的三大组件之一
      • 事件监听机制
        • 事件:一件事情
        • 事件源:事件发生的地方
        • 监听器:一个对象
        • 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码

    2.2 ServletContextListener监听器接口

    • 方法

      • void contextInitialized(ServletContextEvent sce):服务器启动之后,监听器对象ServletContext创建会调用该方法。
      • void contextDestroyed(ServletContextEvent sce):服务器正常关闭,监听器对象ServletContext被销毁时会调用该方法。
    • 步骤:

      1. 定义一个类,实现ServletContextListener接口

      2. 实现接口的方法

      3. 配置

        1. web.xml

          <!--    注册监听器-->
          	<listener>
                  <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
              </listener>
          
                 
                 
          • 注解:@WebListener

      例如:
      • 指定初始化参数
      <!--    指定初始化的参数信息-->
          <context-param>
              <param-name>contextFigLocation</param-name>
              <param-value></param-value>
          </context-param>
      
       
       
        @WebListener()
        public class ListenerText1 implements ServletContextListener{
        	/*
        		Tomcat服务器启动的时候,监听器对象创建的时候会执行该方法
        	 */
        	@Override
        	public void contextInitialized(ServletContextEvent sce) {
        		//加载临时文件
        		//1获取ServletContext对象
        		ServletContext servletContext = sce.getServletContext();
        		//2加载资源文件
        		String contextConfigLocation = servletContext.getInitParameter("applicationContext");
        		//3获取真实路径
        		String realPath = servletContext.getRealPath(contextConfigLocation);
        		//4加载进内存
        		try {
        			FileInputStream fis = new FileInputStream(realPath);
        			System.out.println(fis);
        		}catch (Exception e){
        			e.printStackTrace();
        		}
        	}
        
        	/*
        		Tomcat服务器正常关闭的时候,会执行该方法
        	 */
        
        	@Override
        	public void contextDestroyed(ServletContextEvent sce) {
        
        	}
        }
        

        过滤器案例

        案例1:登录验证
        - 要求:
        1. 访问该项目下资源,都要判断是否登入
        2. 如果登入了直接放行
        3. 如果没登入,跳转到登入界面,提示:您尚未登入,请登入
        //对所有资源的都进行过滤
        @WebFilter("/*")
        public class 登录验证 implements Filter {
        	@Override
        	public void init(FilterConfig filterConfig) throws ServletException {
        	}
        	@Override
        	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        		//1强制转换类型
        		HttpServletRequest request = (HttpServletRequest) servletRequest;
        		//2获取资源请求路径
        		String uri  = request.getRequestURI();
        		//3判断请求路径是否包含登入相关的资源的路径(排出掉登入需要的css jsp js 图片 验证码等等)
        		if(uri.contains("/login.jsp") || uri.contains("/css/") || uri.contains("/js/")){
        			//3.1包含登入相关的的资源--放行
        			filterChain.doFilter(servletRequest,servletResponse);
        		}else{
        			//3.2不包含登入相关的资源
        			//3.2.1判断是否登入了(在请求信息中是否包含用户的信息)
        			Object user = request.getSession().getAttribute("user");
        			if(user!=null){
        				//登入了--放行
        				filterChain.doFilter(servletRequest,servletResponse);
        			}else{
        				//未登入
        				//把未登入的信息保存下来,方便使用
        				request.setAttribute("mfg","您尚未登入,请登入");
        				//跳转到登入界面(进行转发)
        				request.getRequestDispatcher("/login.jsp").forward(request,servletResponse);
        			}
        		}
        	}
        	@Override
        	public void destroy() {
        	}
        }
        
        
        • 2
          点赞
        • 0
          收藏
          觉得还不错? 一键收藏
        • 打赏
          打赏
        • 0
          评论

        “相关推荐”对你有帮助么?

        • 非常没帮助
        • 没帮助
        • 一般
        • 有帮助
        • 非常有帮助
        提交
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包

        打赏作者

        小镇男孩~~

        你的鼓励将是我创作的最大动力

        ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
        扫码支付:¥1
        获取中
        扫码支付

        您的余额不足,请更换扫码支付或充值

        打赏作者

        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

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

        余额充值