过滤器和监听器

1.Servlet规范中三大技术:Servlet,Filter,Listener

2.Filter:对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行 拦截,从而实现一些特殊的功能.

3.Filter作用:实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

4.Filter的工作原理图:

在这里插入图片描述
5.Filter的使用:声明一个Java类,让这个类实现javax.servlet.Filter接口,在web.xml注册这个过滤器 类。注册的顺序决定过滤器在过滤器链中的执行顺序。
eg:/**

  • 过滤器

  • @author sx

  • @version 1.0 2019年1月15日
    */
    public class FirstFilter implements Filter{

    public FirstFilter() {
    System.out.println(“实例化FirstFilter”);
    }

    public void destroy() {
    System.out.println(“销毁FirstFilter”);

    }

    /**

    • 过滤器的处理拦截的请求和响应的方法
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
      System.out.println(“进入FirstFilter的处理方法”);
      //放行:调用下一个过滤或服务器
      chain.doFilter(request, response);

      System.out.println(“结束FirstFilter的处理方法”);

    }

    public void init(FilterConfig arg0) throws ServletException {
    System.out.println(“初始化FirstFilter”);

    }
    }

      <!-- 注册过滤器 -->
    
    FirstFilter com.qf.webday12.filter.FirstFilter FirstFilter /*

6.Filter的生命周期:在发布Web项目时,就实例化Filter(一生只实例化一次),再调用init方法完成初始化 (一生只初始化一次)。当客户端发送请求时就调用过滤器中的doFilter方法,执行放行 之前的代码,当服务器响应信息时就调用过滤器中的doFilter方法,执行放行之后的代 码,doFilter方法可以调用多次,在服务器终止时就调用destroy(一生只实例化一次) 销毁Filter实例释放资源。

7.字符编码过滤器:
eg:/**

  • 字符编码过滤器

  • @author sx

  • @version 1.0 2019年1月15日
    */
    public class CharsetFilter implements Filter {

    /**

    • Default constructor.
      */
      public CharsetFilter() {
      // TODO Auto-generated constructor stub
      }

    /**

    • @see Filter#destroy()
      */
      public void destroy() {
      // TODO Auto-generated method stub
      }

    /**

    • 处理拦截的请求和响应的方法
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      //处理响应的字符编码
      response.setCharacterEncoding(“utf-8”);
      //处理Post请求的字符编码
      request.setCharacterEncoding(“utf-8”);
      //处理get请求的字符编码
      HttpServletRequest request2=(HttpServletRequest) request;
      if (“get”.equalsIgnoreCase(request2.getMethod())) {
      request2=new MyRequest(request2);
      }

      chain.doFilter(request2, response);
      }

    /**

    • 处理get请求的乱码

    • @author sx

    • @version 1.0 2019年1月15日
      */
      class MyRequest extends HttpServletRequestWrapper{
      String method="";

      public MyRequest(HttpServletRequest request) {
      super(request);
      method=request.getMethod();
      }

      @Override
      public String getParameter(String name) {
      String value1=super.getParameter(name);
      if (value1!=null) {
      try {
      value1=new String(value1.getBytes(“ISO-8859-1”), “utf-8”);
      } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }

       return value1;
      

      }

      @Override
      public String[] getParameterValues(String name) {
      String[] values=super.getParameterValues(name);
      for (int i = 0; i < values.length; i++) {
      if (values[i]!=null) {
      try {
      values[i]=new String(values[i].getBytes(“ISO-8859-1”),“utf-8”);
      } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }
      }
      }
      return values;
      }
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }
      }

8.登录权限验证过滤器:已经登录的用户直接可以作后面的操作,没登录过用户拦截,跳转到登录页面
放行:请求登录的Jsp页面(login.jsp),登录Servlet(action=login),登录过的用户(session),请求注册 页面(html),注册Servlet(action=register),请求验证码(CheckCodeServlet2),欢迎页面(html) 放行。
eg: /**

  • 登录权限验证过滤器

  • @author sx

  • @version 1.0 2019年1月15日
    */
    public class PowerFilter implements Filter {

    /**

    • Default constructor.
      */
      public PowerFilter() {
      // TODO Auto-generated constructor stub
      }

    /**

    • @see Filter#destroy()
      */
      public void destroy() {
      // TODO Auto-generated method stub
      }

    /**

    • 处理拦截请求和响应的方法
      */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest request2=(HttpServletRequest) request;
      HttpServletResponse response2=(HttpServletResponse) response;
      String uri1=request2.getRequestURI();
      String action=request2.getParameter(“action”);
      //如果是请求登录的Jsp页面(login.jsp),登录Servlet(action=login),登录过的用户(session),请求注册页面(html),注册Servlet(action=register),请求验证码(CheckCodeServlet2),欢迎页面(html)放行
      if (uri1.endsWith(“login.jsp”)||“login”.equals(action)||request2.getSession().getAttribute(“uname”)!=null||“register”.equals(action)||uri1.endsWith(“CheckCodeServlet2”)) {
      chain.doFilter(request, response);
      }else {
      response2.setContentType(“text/html”);
      response2.getWriter().write(“你还没有登录,无法操作,3秒跳转到登录页面”);
      response2.setHeader(“refresh”, “3;url=login.jsp”);
      }
      }

    /**

    • @see Filter#init(FilterConfig)
      */
      public void init(FilterConfig fConfig) throws ServletException {
      // TODO Auto-generated method stub
      }
      }

9.监听器:监听web项目中常用的对象和对象的属性。

10.监听器作用:
10.1.监听web对象创建与销毁.
10.2.监听web对象的属性变化。

11.监听器的机制:事件源,监听器,注册监听。

12.创建监听器:创建一个Java类,实现监听器接口,重写监听器的方法,在web.xml中注册。


com.qf.webday12.listener.MyRequestListener

13.监听器的分类
13.1:对象监听器
ServletContextListener:监听web对象的创建和销毁。
HttpSessionListener(session的生命期间):监听Session会话对象的创建和销毁。
ServletRequestListener:监听请求对象创建和销毁。

13.2:属性监听器
		ServletContextAttributeListener:监听web对象的属性的变化。
		HttpSessionAttributeListener:监听Session会话对象的属性的变化。
	   ServletRequestAttributeListener	:监听请求对象的属性的变化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值