目录
Filter的生命周期:
1.init:在服务器启动后,会建立Filter对象,而后调用init方法,只执行一次用于加载资源
2.doFilter:每一次请求被拦截都会执行
3.destory:在服务器关闭后,Filter对象会被销毁,如何服务器对象正常关闭,destory方法会被执行一次
设置拦截路径
设置拦截路径有两种方法,一种是注解配置,一种是设置web.xm
注解配置
即加上一个@WebFilter("")
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//设置拦截路径
@WebFilter("/*")
public class Filter1 implements javax.servlet.Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
web.XML配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<filter>
<filter-name>demo1</filter-name>
<filter-class>Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
//设置拦截路径
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
拦截路径配置的讲解
1.具体的资源路径:/index.jsp 只有在访问index.jsp这个资源的时候过滤器才会被执行
2.拦截目录:/user/* 访问/user下的全部资源的时候过滤器才会被执行
3.后缀名拦截:.jsp 访问后缀名为jsp的资源的时候,过滤器才会被执行
4.拦截全部资源:/ 访问全部资源,都会被拦截url
Springboot使用过滤器
SpringBoot中使用过滤器Filter有两种方式
方式一: 通过注解方式实现
方式二:通过 Spring Boot 的配置类实现
方式一: 通过注解方式实现
首先先写一个过滤器Filter,在类的上方使用 @WebFilter 注解来创建Filter即可
package com.liuhaiyang.springboot.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//过滤器
@WebFilter(urlPatterns = "/myservlet")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("---------您已进入过滤器----------");
//跳转到对应的请求
filterChain.doFilter(servletRequest,servletResponse);
}
}
在SpringBoot项目的入口类上方使用注解 @ServletComponentScan 扫描filter包中的注解
package com.liuhaiyang.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan(basePackages = "com.liuhaiyang.springboot.filter") //第一种方式
public class SpringbootTest14Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootTest14Application.class, args);
}
}
在写一个controller
@RequestMapping("/myservlet")
public @ResponseBody String myservlet(){
return "/myservlet";
}
启动测试
方式二:通过 Spring Boot 的配置类实现
首先先写一个过滤器Filter,不使用注解
package com.liuhaiyang.springboot.filter2;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//过滤器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("---------您已进入过滤器222----------");
filterChain.doFilter(servletRequest,servletResponse);
}
}
再写一个配置类
package com.liuhaiyang.springboot.config;
import com.liuhaiyang.springboot.filter2.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //定义此类为配置类
public class FilterConfig {
@Bean
public FilterRegistrationBean myFilterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean(new MyFilter());
//添加过滤路径
filterRegistrationBean.addUrlPatterns("/user/*");
return filterRegistrationBean;
}
}
最后写一个controller类
package com.liuhaiyang.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@RequestMapping("/user/detail")
public @ResponseBody String userDetail(){
return "/user/detail";
}
@RequestMapping("/center")
public @ResponseBody String center(){
return "/center";
}
}
启动测试