SpringBoot里面的过滤器和拦截器都是自定义的,都是自己去手写他们的配置类。
先写一个常量类 用来放session的名字,
public class SpringTools {
public final static String LOG_SESSION = "logsession";
}
过滤器需要实现Filter接口 重写他的方法:
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//把他们转成带协议的
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
//判断Session是否为空
if(session.getAttribute(SpringTools.LOG_SESSION) == null){
res.sendRedirect("/stu/dolog");
}else{
chain.doFilter(req,res);
}
}
@Override
public void destroy() {
}
}
注入Bean
@Configuration
public class LoginFilterConfig {
@Bean
public FilterRegistrationBean registrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new LoginFilter());
//给你这个过滤器取个名字
filterRegistrationBean.setName("LoginFilter");
//你要过滤的地址
filterRegistrationBean.addUrlPatterns("/stu/goShow");
//设置当前过滤器在过滤器中的优先级,默认值是int最大值
filterRegistrationBean.setOrder(2);
return filterRegistrationBean;
}
}
在这一步一个基本的过滤器就配好了
拦截器需要继承HandlerInterceptor接口 :
public class MyLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
//判断有没有session 如果没有就拦截掉我那边设置的/**
if(session.getAttribute(SpringTools.LOG_SESSION) == null){
response.sendRedirect("/stu/dolog");
return false;
}
return true;
}
}
再注入Bean:
//拦截器
@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns代表着拦截所有路径 excludePathPatterns代表不拦截哪些路径
registry.addInterceptor(new MyLoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/stu/dolog","/stu/log");
}
}
这样一个基本的拦截页面的 过滤器和拦截器就完事了,需要注意的一点是 ,如果他们拦截了同样的请求 ,过滤器会先执行,但他们不会冲突。不会导致报错这些。