过滤器
过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的,这个时候,也可以用到过滤器。过滤器的功能还有很多,例如实现URL级别的权限控制、压缩响应信息、编码格式等等。
过滤器依赖servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤。下面简单的说说Spring Boot里面如何增加过滤器。
- 引入spring-boot-starter-web
在pom.xml 中引入spring-boot-starter-web包。 - 建立过滤器程序
@Order(1):表示过滤器的顺序,假设我们有多个过滤器,你如何确定过滤器的执行顺序?这个注解就是规定过滤器的顺序。
@WebFilter:表示这个class是过滤器。 里面的参数,filterName 为过滤器名字,urlPatterns 为过滤器的范围,initParams 为过滤器初始化参数。
过滤器里面的三个方法
- init : filter对象只会创建一次,init方法也只会执行一次。
- doFilter : 主要的业务代码编写方法,可以多次重复调用
- destroy : 在销毁Filter时自动调用(程序关闭或者主动销毁Filter)。
@Slf4j
@WebFilter(urlPatterns = "/*")
public class MyFifter implements Filter {
/**
* 容器加载的时候fifter初始化
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("****容器创建 **我也创建** 我是过滤器****");
}
/**
* 请求被拦截时调用
* @param servletRequest
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("****不好意思你被拦截了****");
HttpServletRequest httpServletRequest =(HttpServletRequest) servletRequest;
HttpServletResponseWrapper hwr = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
HttpSession session = httpServletRequest.getSession();
User user = (User)session.getAttribute("user");
if(user!=null||httpServletRequest.getRequestURI().contains("login")){
filterChain.doFilter(servletRequest, servletResponse);
}else {
hwr.sendRedirect("/login.jsp");
}
}
/**
* 容器销毁时调用
*/
@Override
public void destroy() {
log.info("****容器销毁****我是过滤器 **我也销毁了**********");
}
}
启动类中增加注解,自动注册Filter
@ServletComponentScan :在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
拦截器默认启动 页面
@Configuration
public class MvcConf implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/*");
WebMvcConfigurer.super.addInterceptors(registry);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("index.html").setViewName("login");
}
}
监听器
@WebListener
@Slf4j
public class listener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.info("*********监听器创建********");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
log.info("*********监听器销毁***********");
}
}
自定义拦截器
/**
* @program: springboothello
* @author: Mr.findlist
* 自定义拦截器
* @create: 2020-07-17 09:51
**/
@Slf4j
public class MyHandlerInterceptor implements HandlerInterceptor {
/**
* 在controller之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("controller之前*****perhandle");
return HandlerInterceptor.super.preHandle(request,response,handler);
}
/**
* controller之后渲染之前
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("controller之后*****渲染之前");
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 {
log.info("整个完成*****主要用户资源清理");
HandlerInterceptor.super.afterCompletion(request,response,handler,ex);
}
}