过滤器, 拦截器,监听器

算法蝉翼
• 阅读 5207

下面介绍过滤器和拦截器以及监听器的使用方法:
执行顺序 :监听器 > 过滤器 > 拦截器

一.过滤器

主要的用途是过滤字符编码、或者去除掉一些非法字符
过滤器需要写两部分,一是java类,二是web.xml配置

1.java代码,写个类实现Filter接口(implements Filter)

public class MangerFilter implements Filter {
    public static  UserDaoI userDaoI;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ApplicationContext content = 
        new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml");
        userDaoI = content.getBean(UserDaoI.class);
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest Request = (HttpServletRequest)servletRequest;
        HttpServletResponse Response = (HttpServletResponse) servletResponse;
        HttpSession session  =  Request.getSession();
        String path = Request.getRequestURI();
        String  userName = (String)session.getAttribute("userName");
        User user  = userDaoI.getUserByName(userName);
        session.setAttribute("managerPage",path);
        if(path.indexOf("index")==-1 && path.indexOf("resources")==-1)
            .........
        }else{
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }
    @Override
    public void destroy() {
    }
}

这里需要注意的是在spring中,实现Filter接口的类中不能使用@Autowired注入,需要使用init方法内手动加载配置文件的方法去调用。

2.在web.xml如下

  <filter>
    <filter-name>login</filter-name>
    <filter-class>org.mshu.util.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>login</filter-name>
    <url-pattern>/login/*</url-pattern>
  </filter-mapping>

解释:

  <filter-name>随便取
  <filter-class>过滤器的路径
  <url-pattern>>过滤的路径


小菜:

1.判断是否是Ajax请求

String isAjax = request.getHeader("x-requested-with");

2.另外一般出来编码问题的时候会直接在web.xml中加上这段:这个不需要再写java代码,因为它指向的代码是org.springframework.web.filter.CharacterEncodingFilter已经存在的。直接复制可用,无需改动。

  <!-- Spring字符集过滤器 -->
    <filter>
        <filter-name>SpringEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SpringEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

二.拦截器

类似面向切片的技术,拦截器要做的工作更多是安全方面,比如用户验证,判断是否登陆
日志记录,或者限制时间点访问。
拦截器也是要写两部分,一部分是spring-mvc.xml,另一部分是java类

1.java代码部分,需要一个继承了HandlerInterceptorAdapter抽象类的方法

public class LoginIntercepter extends HandlerInterceptorAdapter{
    /**  
     * 在业务处理器处理请求之前被调用  
     * 如果返回false  
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 
     * 如果返回true  
     *    执行下一个拦截器,直到所有的拦截器都执行完毕  
     *    再执行被拦截的Controller  
     *    然后进入拦截器链,  
     *    从最后一个拦截器往回执行所有的postHandle()  
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()  
     */    
    @Override    
    public boolean preHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler) throws Exception {    
        String username =  (String)request.getSession().getAttribute("adminName");
        if(username == null){
//            request.getRequestDispatcher("/WEB-INF/content/login/index.jsp").forward(request, response);
            System.out.println("拦截来了");
            return false;
        }else{
            return true;
        }
    }    
    
    /** 
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
     * 可在modelAndView中加入数据,比如当前时间 
     */  
    @Override    
    public void postHandle(HttpServletRequest request,    
            HttpServletResponse response, Object handler,    
            ModelAndView modelAndView) throws Exception {     
    }    
    
    /**  
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
     *   
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
     */    
    @Override    
    public void afterCompletion(HttpServletRequest request,    
            HttpServletResponse response, Object handler, Exception ex)    
            throws Exception {    
    }

2.spring-mvc.xml部分

 <?xml version="1.0" encoding="UTF-8"?>  
   <beans xmlns="http://www.springframework.org/schema/beans"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:mvc="http://www.springframework.org/schema/mvc"  
      xsi:schemaLocation="http://www.springframework.org/schema/beans  
                       http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
                       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 
    <!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>    
    <mvc:interceptor>    
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login/**" />
        <mvc:exclude-mapping path="/resources/**" />
        <bean class="interceptor.LoginIntercepter"></bean>
    </mvc:interceptor>  
    <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,
    然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->  
</mvc:interceptors>

<mvc:mapping>表示拦截的路径 /**为全路径
<mvc:exclude-mapping>表示不拦截的路径。

小菜:

如果你发现<mvc:exclude-mapping>似乎不起作用,还是被拦截,并且页面出现了如下的错误

Resource interpreted as Stylesheet but transferred with MIME type text/plain
Uncaught ReferenceError: $ is not defined

那么请你把静态文件加入免拦截<mvc:exclude-mapping>的队伍中,现在看起来很合理,但是查bug的时候,,哎,鬼知道我经历的什么。

三.监听器

用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理,
系统启动时加载初始化信息
监听器的功能是在项目启动和销毁时候搞事情:
和上面一样两部分:

1.监听器类

实现ServletContextListener接口即可
public class initListener implements ServletContextListener{
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

2.编写web.xml文件

  <!-- 初始化监听器-->
  <listener>
    <listener-class>org.yaoyan.util.initListener</listener-class>
  </listener>
  

<listener-class>是将要写的监听器类的路径

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Easter79 Easter79
3年前
SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
一简介(1)过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等关于
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot 的过滤器 Filter 配置的三种方式
SpringBoot过滤器配置有三种方式1\.@ServletComponentScan@WebFilter,可配置过滤路径,但没有顺序(顺序是由过滤器命名决定)在启动类上使用 @ServletComponentScan,在过滤器类上使用 @WebFilter(urlPatterns{"/test/path"})
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Spring MVC 自带的字符编码过滤器以及Tomcat字符编码设置,彻底解决中文参数乱码问题
一、SpringMVC字符编码配置javaWeb项目添加Spring支持后,可使用Spring自带的字符编码过滤器。源码在springweb4.1.0.RELEASE.jar包下的org.springframework.web.filter目录的CharacterEncodingFilter.java。在web.xml文件中配置:
Stella981 Stella981
3年前
Spring mvc之拦截器介绍
一、拦截器介绍 (1)拦截器概念介绍        拦截器(Interceptor)是Spring的核心功能之一,它可以在用户请求Action的之前或之后进行一些业务处理。        很多从ASP.NET转过来的开发人员把它叫做过滤器。(2)拦截器方法执行顺序
Wesley13 Wesley13
3年前
Java过滤器与SpringMVC拦截器的差异学习笔记
学习摘录地址:http://blog.csdn.net/chenleixing/article/details/44573495今天学习和认识了一下,过滤器和SpringMVC的拦截器的区别,学到了不少的东西,以前一直以为拦截器就是过滤器实现的,现在想想还真是一种错误啊,而且看的比较粗浅,没有一个全局而又细致的认识,由于已至深夜,时间原因,我就把一些网友
Stella981 Stella981
3年前
Servlet 3.0 之@WebFilter怎么控制多个filter的执行顺序
 之前我们控制多个filter的执行顺序是通过web.xml中控制filter的位置来控制的,放在上面的会比放在下面的先执行,如下“用户登录检查过滤器”会比“接口日志过滤器”先执行!复制代码(https://oscimg.oschina.net/oscnet/b6cddad28c507c7e7de7eac1f9c0b27fbfe.gif)