过滤器Filter和监听器Listenter【JAVAEE基础】

JAVAWEB三大组件:

Servlet Filter Listenter

过滤器Filter

当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

1.过滤器的作用:

一般用于完成通过的操作。如:登录验证、统一编码设置、敏感字符的过滤…

2.使用步骤:

1.实现接口Filter
2.复写方法
3.设置拦截路径。url-pattren/注解

代码:

@WebFilter("*.jsp")
public class Filter implements javax.servlet.Filter {
    public void destroy() {
       // System.out.println("destroy....");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
       // System.out.println("doFilter......");
        chain.doFilter(req, resp);//放行
    }

    public void init(FilterConfig config) throws ServletException {
       // System.out.println("init......");
    }

}

3.Filter生命周期:

   init():在服务器启动后,会创建Filter对象,然后调用init方法。
   doFilter():每一次请求被拦截资源是,都会执行。
   destroy():在服务器关闭后,Filter对象被销毁,如果服务器是正常关闭,会调用destroy方法。

4.拦截方式配置:资源被访问的方式

*注解配置
 
    设置dispatcherTypes属性 
	@WebFilter(value="/index.jsp",dispatherTypes={DispatcherType.FORWARD,DispatcherType.REQUEST})
	   1.REQUEST:默认值,浏览器直接请求资源
	   2.FORWARD:转发访问资源
	   3.LNCLUDE:包含访问资源
	   4.ERROR:错误跳转资源
	   5.ASYNC:异步访问资源
 *web.xml配置
    <filter-mapping>
	<filter-name>xxx</filter-name>
	<url-pattern></url-pattern>
	<dispatcher>拦截方式</dispatcher>
    </filter-mapping>

5.过滤器链(配置多个过滤器)

  * 执行顺序:两个过滤器1和2
    1.过滤器1
	2.过滤器2
	3.资源执行
	4.过滤器2
	5.过滤器1

   *过滤器执行先后顺序问题:
 1.注解配置:按照类名的字符串比较规则,值小的先执行
    如:AFilter和BFilter  A先执行
 2.web.xml配置:<filter-mapping>谁定义在上边谁先执行。

6.案例:

 1.案例1_登录验证
   *需求:
    1.访问项目的所有资源,都验证是否登录
    2.登录了,放行
    3.没有登录,跳转到登录页面。

Filter实现类:

package com.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
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 IOException, ServletException {
        //0.强制转换
        HttpServletRequest request= (HttpServletRequest) servletRequest;

        //获取资源请求路径
        String uri = request.getRequestURI();
        //判断是否包含登录的相关路径
        if (uri.contains("login.html") || uri.contains("/LoginServlet") || uri.contains("/css") || uri.contains("/fonts") || uri.contains("/js") || uri.contains("/images")){
            //包含,放行
            filterChain.doFilter(servletRequest,servletResponse);
        } else {
            //不包含,验证用户是否登录
            //从session中获取USER对象
            Object user = request.getSession().getAttribute("user");
            if (user!=null){
                //已登录,放行
                filterChain.doFilter(servletRequest,servletResponse);
            } else {
                //没有登录就跳转到登录页面
                request.setAttribute("logno_errot","尚未登录,请登录");
                request.getRequestDispatcher("login.html").forward(request,servletResponse);
            }
        }


    }

    @Override
    public void destroy() {

    }
}

  2.案例2_敏感词汇过滤
  *需求:
    1.对day17_case案例登录录入的树精进行敏感词汇过滤
    2.敏感词汇参考《敏感词汇.txt》
    3.如果是敏感词汇,替换为***
      
  *分析
     1.对request对象进行增强,增强获取参数相关方法。
     2.放行,传递代理对象

  *增强对象的功能:设计模式
          1.装饰模式
      	  2.代理模式
  *概念:
	 1.真实对象:被代理的对象
     2.代理对象:
	 3.代理模式:代理对象代理真实对象,达到增强真实对象功能的的目的。
  *实现方式:
	  1.静态代理:有一个类文件描述代理模式
	  2.动态代理:在内存中形成代理类。
 *实现步骤:
	       1.代理对象和真实对象实现相同的接口
	       2.代理对象=Proxy.newInstance();
	       3.使用代理对象

  *增强方式:
	       1.增强参数列表
	       2.增强返回值类型
	       3.增强方法执行逻辑
package com.filter;

import javax.servlet.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

/**
 * 敏感词汇过滤器
 */
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
    private List<String> list=new ArrayList<String>();//敏感词汇集合
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        try{
            //1.加载文件,获取真实路径
            ServletContext servletContext = filterConfig.getServletContext();
            String realPath = servletContext.getRealPath("/WEB-INF/classes/com/filter/敏感词汇.txt");
            //2.读取文件
            BufferedReader br=new BufferedReader(new FileReader(realPath));
            //3.将文件的每一行数据添加到List中
            String line=null;
            while((line=br.readLine())!=null){
                list.add(line);
            }
            br.close();
        } catch (Exception e){
            e.printStackTrace();
        }


    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //1.创建代理对象,增强getParameter方法
        ServletRequest proxy_requset = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强getParameter方法
                //判断是否是getParameter方法
                if (method.getName().equals("getParameter")){
                    //增强返回值
                    //获取返回值
                    String value = (String) method.invoke(servletRequest, args);
                    if (value!=null){
                        for (String str:list){
                            if (value.contains(str))
                                value=value.replaceAll(str,"***");
                        }
                    }
                    return value;

                }
                return method.invoke(servletRequest,args);
            }
        });

        //2.放行
        filterChain.doFilter(proxy_requset, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

14.监听器Listener(了解)

 *事件监听机制
     *事件   :一件事情
 *事件源 :事件发生的地方
 *监听器 :一个对象
 *注册监听:将事件、事件源、监听器绑定在一起。
             当事件源上发生某个事件后,执行监听器代码
 
 *ServletContextListener接口:监听ServletContext的创建和销毁
    *方法:
    *void contextDestroy(ServletContextEvent sce)    :ServletContext销毁前调用的方法
    *void contextInitialized(ServletContextEvent sce):ServletContext对象创建后调用的方法
   
 *实现步骤;
    1.定义一个类,实现ServletContextListenter接口
    2.复写方法
    3.配置
        1.web.xml
		2.注解 :  @WebListener
	   	
    3.指定初始化参数
	   <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/路径</param-value>
	   </context-param>
  *其他应用:GUI界面化布局
     ....   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>