过滤器和监听器

时间:2023-02-13 10:48:56

一、过滤器

  1、过滤器的实现

    1)实现java.servlet.Fileter接口

      过滤器和监听器

    2)重写方法

       init():初始化,服务启动时加载,只加载一次

      doFilter():过滤处理方法

      destroy():销毁,服务关闭时销毁

  2、过滤器链执行顺序

    先配置先执行(请求时的执行顺序);响应时:以相反的顺序执行。

      过滤器和监听器

 

  3、filter过滤器

    1)在请求到达资源之前,拦截request请求

    2)在响应到达客户端之前,拦截response响应

    3)当访问资源时,如果设置了过滤器的路径,过滤器需要放行,否则请求无法到达资源

    4)过滤器链:

      顺序:请求的顺序是配置文件中的先后顺序,响应的顺序相反

      过滤器链中,第一个过滤器如果没有放行,则无法到达下一个过滤器,资源也无法访问

      原理:会拦截到请求的过滤器:第一个过滤器如果放行,会进入下一个过滤器,如果没有下一个过滤器,则进入指定资源

    5)chain.doFilter(request,response);方法之前处理请求相关信息,方法之后处理响应相关信息

  

  4、过滤器过滤Tomcat7和Tomcat8针对GET和POST请求乱码

    

过滤器和监听器过滤器和监听器
package com.shsxt.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

public class EncodingFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        //http
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;
        //请求post
        request.setCharacterEncoding("UTF-8");
        //响应
        response.setContentType("text/html;charset=utf-8");
        //得到请求方式get/post
        String method=request.getMethod();
        //判断是post还是get请求
        if ("GET".equals(method.toUpperCase())) {
            //获取服务器版本
            String serverInfo=request.getServletContext().getServerInfo();
            //判断服务器版本是Tomcat7还是Tomcat8
            String versionStr=serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("/")+2);
            if (Integer.parseInt(versionStr)<8) {
                MyEncoding myEncoding=new MyEncoding(request);
                HttpServletRequest request2=(HttpServletRequest)myEncoding;
                chain.doFilter(request2, response);
                return;
            }
        }
        
        chain.doFilter(request, response);
        //判断
        
        
        
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }
    class MyEncoding extends HttpServletRequestWrapper{
        HttpServletRequest request;
        public MyEncoding(HttpServletRequest request) {
            super(request);
            // TODO Auto-generated constructor stub
            this.request=request;
        }
        String value="";
        @Override
        public String getParameter(String name) {
            try {
                value=new String(request.getParameter(name).getBytes("ISO-8859-1"),"utf-8");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return value;
        }
        
    }

}
EncodingFilter

 

 

二、监听器

  监听器是一种servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HTTPSession,ServletRequest的创建和销毁等。

 

  1、实现

    监听器有三类8种:

      ⑴监听生命周期:实现接口ServletRequestListener、HttpSessionListener、ServletContextListener

      ⑵监听值的变化:实现接口ServletRequestAttributeListener、HttpSessionAttributeListener、ServletContextAttributeListener

      ⑶针对session中的对象:监听session中的java对象(javaBean)是javaBean直接实现监听器的接口

  

  2、servlet2.5 监听器配置

     过滤器和监听器

 

三、Servlet3.0注解

  1、解释

    @WebServlet,配置Servlet

    @WebFilter,配置过滤器

    @WebListener,注解监听器

    @MultipartConfig,将一个Servlet标识为支持上传

      Servlet3.0将mulipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

 

  2、通过注解,上传文件

    如果是文件上传表单

      1、必须设置enctype="multipart/form-data",设置MIME编码

      2、请求方式为POST

      3、文件域需要设置name属性值     

      使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
      Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作

      过滤器和监听器