filter,servlet,listener,interceptor

在SpringBootApplication上使用@ServletComponentScan注解后,

Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。

过滤器

默认使用的4个

在启动打印出来的日志里有:

  • Filter ‘requestContextFilter‘ configured for use
  • Filter ‘hiddenHttpMethodFilter‘ configured for use
  • Filter ‘characterEncodingFilter‘ configured for use
  • Filter ‘formContentFilter‘ configured for use

优先级

低位值意味着更高的优先级。自定义Filter,避免和默认的Filter优先级一样,不然会冲突。

作用(使用场景)

  • 比如用户验证。
  • 如果涉及页面跳转,filter就不适合 前后端分离的情况。

实例

启动类 加上 注解

@ServletComponentScan

自定义的filter

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = {"/api/*"})
public class LoginFilter implements Filter {

    /**
     * 容器加载的时候调用
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init loginFilter");
    }

    /**
     * 请求被拦截的时候进行调用
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter loginFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String username = request.getParameter("username");
        if ("xdclass".equals(username)) {
            filterChain.doFilter(request, response);
        }else {
            response.sendRedirect("/index.html");    // 重定向
        }
    }

    @Override
    public void destroy() {
        System.out.println("destroy loginFilter");
    }
}

测试

添加controller的访问方法。

@GetMapping(value="/api/v1/account")
public Object account(){
    params.put("money", "1000");
    return params;
}

访问  http://localhost:8080/api/v1/account?username=xdclass

{
"money": "1000"
}

测试通过。

自定义servlet

例子

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {"/v1/api/test/customs"}, name = "userServlet")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("custom sevlet");
        resp.getWriter().flush();
        resp.getWriter().close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

启动类 加上 @ServletComponentScan , 和 过滤器的使用 很像。

监听器

自定义Listener(常用的监听器 servletContextListener、httpSessionListener、servletRequestListener)。

@WebListener
public class RequestListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        // TODO Auto-generated method stub
       System.out.println("======requestDestroyed========");
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
     System.out.println("======requestInitialized========");
  } 、
}

拦截器

1、老方法,jdk8之前

继承 WebMvcConfigurerAdapter


import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;


@Configuration
public class CustomOldWebMvcConfigurer extends WebMvcConfigurerAdapter {


@Override
public void addInterceptors(InterceptorRegistry registry) {


registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api/");

super.addInterceptors(registry);
}

 

2、jdk8之后的新方法

使用 implements WebMvcConfigurer

import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configurationpublic class CustomWebMvcConfigurer implements WebMvcConfigurer {

    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new LoginIntercepter())                .addPathPatterns("/api/login/**");        WebMvcConfigurer.super.addInterceptors(registry);    }}

3、以上添加了拦截器,现在 给出自定义的拦截器。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginIntercepter implements HandlerInterceptor{

    /**
     * 进入controller方法之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginIntercepter------->preHandle");

//        String token = request.getParameter("access_token");
//
//        response.getWriter().print("fail");

        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    /**
     * 调用完controller之后,视图渲染之前
     */
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        System.out.println("LoginIntercepter------->postHandle");

        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 整个完成之后,通常用于资源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("LoginIntercepter------->afterCompletion");

        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }

}

小结

  • 是基于函数回调 doFilter(),而Interceptor则是基于AOP思想。
  • Filter在只在Servlet前后起作用,而Interceptor能够深入到方法前后、异常抛出前后等。
  • 依赖于Servlet容器即web应用中,而Interceptor不依赖于Servlet容器所以可以运行在多种环境。
  • 在接口调用的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
  • Filter和Interceptor的执行顺序 过滤前->拦截前->action执行->拦截后->过滤后。

原文地址:https://www.cnblogs.com/wuyicode/p/11251983.html

时间: 2024-10-08 19:18:55

filter,servlet,listener,interceptor的相关文章

servlet/filter/listener/interceptor区别与联系

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet.filter.listener?还有个interceptor?对于这几个概念,本应是初学者就掌握的东东了,可惜本人基础学的不好,只能是现在补课.于是就有了这篇博客. 慢

servlet/filter/listener/interceptor区别与联系(转)

由于最近两个月工作比较清闲,个人也比较"上进",利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet.filter.listener?还有个interceptor?对于这几个概念,本应是初学者就掌握的东东了,可惜本人基础学的不好,只能是现在补课.于是就有了这篇

servlet & filter & listener & interceptor

1.servlet url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面.它主要用来在业务处理之前进行控制. 2.filter url传来之后,检查之后,可保持原来的流程继续向下执行. filter可用来进行字符编码的过滤,检测用户是否登陆,禁止页面缓存等 3.servlet 与 filter 都是针对url之类的,而listener是针对对象的操作的.如: session的创建,Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数

【转】servlet/filter/listener/interceptor区别与联系

原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server.此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API.Servlet 的主要功能在

servlet/filter/listener/interceptor过滤器、监听器、拦截器区分

因为之前一直分不清过滤器和拦截器的区别,所以有了两者差不多的错觉,因此在这里总结下servlet/filter/listener/interceptor过滤器.监听器.拦截器. 在此之前先简单回顾下servlet: 概述:servlet是一种运行服务器端的java应用程序,它工作在客户端请求与服务器响应的中间层. 主要作用:在于交互式地浏览和修改数据,生成动态 Web 内容. 访问流程: 1,客户端发送请求至服务器端: 2,服务器将请求信息发送至 Servlet: 3,Servlet 生成响应内

servlet、filter、listener继承的基类和获得作用域的方式

一.servlet: 1.servlet属于j2ee的组件,构建servlet的web project不需要导入项目框架jar包 2.servlet的体系结构:  在j2ee API中,提供给servlet的支持接口和基类都位于javax.servlet.*和javax.servlet.http.*(提供所有与http请求有关的API)两个包中  servlet包中常使用的接口   Interface ServletConfig   Interface ServletContext   Inte

web.xml 相关 listener filter servlet

突然发现知识忘记了···记一下··· 配置节的加载顺序: context-param -> listener -> filter -> servlet (同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的) Filter:  在请求一个资源或者从一个资源返回信息的时候执行过滤操作的插件(形如权限控制) javax.servlet.Filter接口 对用户请求的预处理    Filter不是一个servlet,它不能产生一个response,它能够在一个r

web.xml之context-param,listener,filter,servlet加载顺序及其周边

先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如filter 需要用到 bean ,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null:所以,如果过滤器中要使用到 bean,此时就可以根据加载顺序listener>filter>servlet,将spring 的加载 改成 Listener的方式.

web.xml中关于Servlet、Filter、Listener的配置

(一)web.xml不同元素的加载顺序 加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的 (二)web.xml文件详解 (2.1) 首先是sche