zoukankan      html  css  js  c++  java
  • 过滤器和监听器

    一、过滤器

      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 对上传的文件进行操作

          

  • 相关阅读:
    java操作生成jar包 和写入jar包
    jboss配置jndi连接池
    windows 域的LDAP查询相关举例
    LDAP error Code 及解决方法
    HDU 6417
    CF1299D Around the World
    codechef Chef and The Colored Grid
    Educational Codeforces Round 82 (Rated for Div. 2)
    CF1237F Balanced Domino Placements
    CF1254E Send Tree to Charlie
  • 原文地址:https://www.cnblogs.com/dhome/p/9563109.html
Copyright © 2011-2022 走看看