世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

shape
  • Home
  • 乌拉圭世界杯冠军
  • springboot学习之九过滤器、拦截器的区别和使用

springboot学习之九过滤器、拦截器的区别和使用

  • 2025-07-30 23:01:43
  • admin

区别:

一、过滤器与拦截器的对比

1.使用范围不同:过滤器是基于Servlet,而拦截器是基于Spring的,Spring框架底层又离不开Servlet,所以过滤器也能在Spring体系中使用。2.使用资源不同:拦截器有Spring的支持,能够方便的向容器中注册对象和使用对象,但是过滤器就不能。3.使用场景不同:灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,Filter主要是针对URL地址做一个编码、过滤掉没用的参数、安全校验等,要是处理些繁杂的业务逻辑,还是建议用拦截器方便注册和使用容器中的对象。4.实现方式不同:过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射。5.拦截范围:过滤器几乎可以对所有请求起作用,而拦截器只会对Controller中请求或访问static目录下的资源请求起作用。(因为拦截器内部是JDK动态代理实现的,拦截的对象只能是实现了接口的对象,而不能拦截url这种链接)

动态代理的方式有两种:JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGLIB动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

二、监听器

监听器是一种Servlet特殊类,它们能帮助开发者监听Web中特定的事件,比如ServletContext、HttpSession、ServletRequest等对象的创建和销毁,在某些动作前后增加处理,实现监控。

监听器的使用场景很多,比如监听ServletContext用来初始化一些数据、监听HttpSession用来获取当前在线的人数、监听ServletRequest对象来获取用户的访问信息等。

使用:

spring boot 使用过滤器

两种方式:1、使用spring boot提供的FilterRegistrationBean注册Filter2、使用原生servlet注解定义Filter两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

方式一:

①、先定义Filter:

package com.hwm.filter;

import javax.servlet.*;

import java.io.IOException;

public class MyFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

// do something 处理request 或response

System.out.println("filter1");

// 调用filter链中的下一个filter

filterChain.doFilter(servletRequest,servletResponse);

}

@Override

public void destroy() {

}

}

②、注册自定义Filter

@Configuration

public class FilterConfig {

@Bean

public FilterRegistrationBean registrationBean() {

FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());

filterRegistrationBean.addUrlPatterns("/*");

return filterRegistrationBean;

}

}

方式二:

@Order(1)// 注入spring容器

@Component

// 定义filterName 和过滤的url

@WebFilter(filterName = "my2Filter" ,urlPatterns = "/*")

public class My2Filter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

System.out.println("filter2");

}

@Override

public void destroy() {

}

}

order定义filter的优先级,值越小优先级越高,因此运行顺序为

filter3—doFilter—>filter2—doFilter—>filter1—doFilter—>控制器方法—>返回到filter1—>返回到filter2—>返回到filter3

Spring boot拦截器的使用:

①、定义拦截器:

/**

* 登录检查

* 1.配置到拦截器要拦截哪些请求

* 2.把这些配置放在容器中

*

* 实现HandlerInterceptor接口

*/

public class LoginInterceptor implements HandlerInterceptor {

/**

* 目标方法执行之前

* 登录检查写在这里,如果没有登录,就不执行目标方法

* @param request

* @param response

* @param handler

* @return

* @throws Exception

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

// 获取进过拦截器的路径

String requestURI = request.getRequestURI();

// 登录检查逻辑

HttpSession session = request.getSession();

Object loginUser = session.getAttribute("loginUser");

if(loginUser !=null){

// 放行

return true;

}

// 拦截 就是未登录,自动跳转到登录页面,然后写拦截住的逻辑

return false;

}

/**

* 目标方法执行完成以后

* @param request

* @param response

* @param handler

* @param modelAndView

* @throws Exception

*/

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

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

}

/**

* 页面渲染以后

* @param request

* @param response

* @param handler

* @param ex

* @throws Exception

*/

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

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

}

}

②、配置拦截器:

@Configuration

//定制SpringMVC的一些功能都使用WebMvcConfigurer

public class AdminWebConfig implements WebMvcConfigurer {

/**

* 配置拦截器

* @param registry 相当于拦截器的注册中心

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

// 下面这句代码相当于添加一个拦截器 添加的拦截器就是我们刚刚创建的

registry.addInterceptor(new LoginInterceptor())

// addPathPatterns()配置我们要拦截哪些路径 addPathPatterns("/**")表示拦截所有请求,包括我们的静态资源

.addPathPatterns()

// excludePathPatterns()表示我们要放行哪些(表示不用经过拦截器)

// excludePathPatterns("/","/login")表示放行“/”与“/login”请求

// 如果有静态资源的时候可以在这个地方放行

.excludePathPatterns("/","/login");

}

}

三个器写好,配置到一块

@Configuration

public class WebConfig implements WebMvcConfigurer {

@Autowired

MyInterceptor myInterceptor;

/**

* 注册拦截器 (spring)

* @return

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(myInterceptor);

}

/**

* 注册过滤器 (servlet)

* @return

*/

@Bean

public FilterRegistrationBean filterRegistrationBean(){

FilterRegistrationBean filterRegistration = new FilterRegistrationBean();

filterRegistration.setFilter(new MyFilter());

filterRegistration.addUrlPatterns("/*");

return filterRegistration;

}

/**

* 注册监听器 (servlet,集成指定的监听器)

* @return

*/

@Bean

public ServletListenerRegistrationBean registrationBean(){

ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean();

registrationBean.setListener(new MyHttpRequestListener());

registrationBean.setListener(new MyHttpSessionListener());

return registrationBean;

}

}

转 : https://blog.csdn.net/heweimingming/article/details/79993591

https://www.cnblogs.com/haixiang/p/12000685.html

https://www.cnblogs.com/dayu123/p/16486482.html

https://blog.csdn.net/zth13015409853/article/details/126404344

https://blog.csdn.net/cristianoxm/article/details/119735912

https://www.cnblogs.com/hanliukui/p/13198173.html

https://blog.csdn.net/weixin_51351637/article/details/128058053

<<<
Previous Post
栎抒名字含义:

Copyright © 2088 世界杯门票_托马斯穆勒世界杯进球数 - noh16.com All Rights Reserved.

友情链接