1.先创建model
2.创建如下
3.创建WebConfig
使用Bean注解,将其方法都放入到容器中,第一个方法相当于是给容器中的noFilter数组初始化值"/one,/two"
附上源码
import com.csq.springbootfilterbean.filter.FirstFilter;
import com.csq.springbootfilterbean.filter.TwoFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//用于定义配置类,可替换xml配置文件
public class WebConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean=new FilterRegistrationBean(new FirstFilter());
//过滤所有路径
registrationBean.addUrlPatterns("/*");
//是用来初始化filter参数的,
// 这里添加后可以通过filterConfig.getInitParameter(“paramName”);取得后面的值
//添加不过滤路径
registrationBean.addInitParameter("noFilter","/one,/two");
//设置此注册的名称
registrationBean.setName("firstFilter");
//设置执行顺序,值越小越先进行
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean twoFilterRegistrationBean() {
FilterRegistrationBean registrationBean=new FilterRegistrationBean(new TwoFilter());
registrationBean.setOrder(2);
registrationBean.addUrlPatterns("/*");
registrationBean.setName("TwoFilter");
return registrationBean;
}
}
4,创建FirstFilter类
isFilter方法表示判断这个路径是不是需要过滤,如果它属于noFilters中,那么他就是不过滤,就返回true,否则返回false,接着再回到doFilter类里面,如果flag是true,表示可以访问,则将请求转达给下一个filter,如果没有下一个filter,就是你的请求资源。如果不可以访问,则跳转路径到/onRoot Servlet
附上源码
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class FirstFilter implements Filter {
private String[] noFilters;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String noFilter=filterConfig.getInitParameter("noFilter");
if(noFilter!=null&&noFilter.length()>0) {
noFilters=noFilter.split(",");
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这里是FirstFilter");
HttpServletRequest request=(HttpServletRequest) servletRequest;
boolean flag=isFilter(request);
if(flag) {
System.out.println("可以访问");
filterChain.doFilter(servletRequest,servletResponse);
}
else {
System.out.println("不可访问");
request.getRequestDispatcher("/noRoot").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
public boolean isFilter(HttpServletRequest request) {
String requestURI=request.getRequestURI();
for(String noFilter:noFilters) {
System.out.println(noFilter);
if(requestURI.contains(noFilter)) {
return true;
}
}
return false;
}
}
5.创建TwoFilter类
附上源码
import javax.servlet.*;
import java.io.IOException;
public class TwoFilter 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("这里是TwoFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
6.controller层
源码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class IndexController {
@RequestMapping({
"/","/index"})
public String index() {
return "欢迎进入首页";
}
@RequestMapping("noRoot")
public String noRoot(){
return "请先登录";
}
@RequestMapping("/one")
public String one() {
return "one";
}
@RequestMapping("/two")
public String two() {
return "two";
}
}
7.测试
/index是要过滤的,所以会走if else 中的else跳转到/noRoot界面
onRoot同上
one不过滤,会进入下一个filter,所以这里是TwoFilter
/two同上