Maison >Java >javaDidacticiel >Quel est le principe et la méthode d'enregistrement du filtre dans Springboot
Regardez d'abord l'emplacement du filtre du serveur web. Le filtre est une chaîne connectée avant et après. Une fois le traitement précédent terminé, il est transmis au filtre suivant pour traitement.
public interface Filter { //初始化方法,整个生命周期中只执行一次。 //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。 //参数FilterConfig用于获取初始化参数 public void init(FilterConfig filterConfig) throws ServletException; //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法 //才能将请求交经下一个Filter或Servlet执行 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; //销毁方法,当移出服务时由web容器调用。整个生命周期中destroy方法只会执行一次 //destroy方法可用于释放持有的资源,如内存、文件句柄等 public void destroy(); }
Les paramètres d'entrée du filtre sont la demande et la réponse. Le filtre est généralement utilisé pour effectuer certains travaux de prétraitement, comme effectuer des inspections, des vérifications, etc. F1.2 Filtre personnalisé
public class LoginFilter implements Filter { @Override public void destroy() { System.out.println("filter destroy method"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter doFilter method "); // 继续传递下去 filterChain.doFilter(arg0,arg1); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("filter init method"); } }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean indexFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter()); registration.addUrlPatterns("/"); return registration; } }E
2.2.1 Ajouter une note sur Filter@Webfilterrrrrrrrrrrr
@WebFilter(urlPatterns = "/",filterName = "filter1") @Order(1) public class LoginFilter implements Filter { @Override public void destroy() { System.out.println("filter destroy method"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter doFilter method 1 "); filterChain.doFilter(arg0,arg1); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("filter init method"); } }
2. 2.2.2 Ajouter l'annotation @ ServletComponentScan à la classe de démarrage
@SpringBootApplication @ServletComponentScan public class FilterTestApplication { public static void main(String[] args) { SpringApplication.run(FilterTestApplication.class, args); } }Remarque : @ServletComponentScan analysera toutes les classes avec @WebFilter et les enregistrera en tant que servlets. Si la classe de démarrage n'ajoute pas cette annotation, l'ajout de l'annotation Component sur le filtre peut également être enregistrée en tant que filtrel'annotation d'ordre peut ajuster l'ordre des filtres2.3 S'inscrire via servletContext
@Autowired ServletContext servletContext; servletContext.addFilter()
3.1.1 Utiliser l'injection automatique
@Autowired private ServletContext servletContext;
3.1.2 requête pour. get servletContext
ServletContext servletContext = request.getServletContext();
3.1.3 Implémenter ServletContextListener
@Component public class TestListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println(sce); } }3.2 ServletRegistrationBeanRegardez la définition de Filter, vous pouvez voir que c'est la même chose que le contenu de l'annotation du filtre Web
public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> { private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"}; private T servlet; private Set<String> urlMappings; private boolean alwaysMapUrl; private int loadOnStartup; private MultipartConfigElement multipartConfig; ...... }Utilisez généralement sa sous-classe FilterRegistrationBean en développement , et utilisez 2.1 ci-dessus pour vous inscrire manuellement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!