过滤器拦截器监听器具体代码实现

过滤器

过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的,这个时候,也可以用到过滤器。过滤器的功能还有很多,例如实现URL级别的权限控制、压缩响应信息、编码格式等等。
过滤器依赖servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤。下面简单的说说Spring Boot里面如何增加过滤器。

  1. 引入spring-boot-starter-web
    在pom.xml 中引入spring-boot-starter-web包。
  2. 建立过滤器程序
    @Order(1):表示过滤器的顺序,假设我们有多个过滤器,你如何确定过滤器的执行顺序?这个注解就是规定过滤器的顺序。
    @WebFilter:表示这个class是过滤器。 里面的参数,filterName 为过滤器名字,urlPatterns 为过滤器的范围,initParams 为过滤器初始化参数。

过滤器里面的三个方法

  1. init : filter对象只会创建一次,init方法也只会执行一次。
  2. doFilter : 主要的业务代码编写方法,可以多次重复调用
  3. 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);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值