过滤器监听器

 

 

过滤器实现1
@SpringBootApplication(scanBasePackages="cn.com.xmh")
public class EurekaTest {
    public static void main(String[] args) {
        SpringApplication.run(EurekaTest.class, args);
    }
@Bean
public FilterRegistrationBean testFilterRegistration() {
	FilterRegistrationBean registration = new FilterRegistrationBean(new TestFilter());
	registration.addUrlPatterns("/webapi/*"); //
	registration.addInitParameter("paramName", "paramValue"); //
	registration.setName("testFilter");
	registration.setOrder(1);//数字越小,优先级越高
	return registration;
}

过滤器实现2
@SpringBootApplication(scanBasePackages="cn.com.xmh")
@Import({
        MywebConfig.class
})
public class EurekaTest {
    public static void main(String[] args) {
        SpringApplication.run(EurekaTest.class, args);
    }
}

@Configuration
public abstract class MywebConfig {//implements WebMvcConfigurer
//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/zxc/foo").setViewName("foo");
//    }
//
//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
////        registry.addInterceptor(new MyInterceptor())
////                .addPathPatterns("/asd/**");
//    }
    @Bean
    public FilterRegistrationBean filterRegist() {
        FilterRegistrationBean frBean = new FilterRegistrationBean();
        frBean.setFilter(new MyFilter());
        frBean.addUrlPatterns("/*");
        System.out.println("filter");
        return frBean;
    }
    @Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(new MyHttpSessionListener());
        System.out.println("listener");
        return srb;
    }
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println(servletRequest.getParameter("name"));
        System.out.println("myfilter231312313123");
        HttpServletRequest hrequest = (HttpServletRequest)servletRequest;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
//        if(hrequest.getRequestURI().indexOf("/index") != -1 ||
//                hrequest.getRequestURI().indexOf("/asd") != -1 ||
//                hrequest.getRequestURI().indexOf("/online") != -1 ||
//                hrequest.getRequestURI().indexOf("/login") != -1
//        ) {
//            filterChain.doFilter(servletRequest, servletResponse);
//        }else {
//            wrapper.sendRedirect("/login");
//        }
    }
    @Override
    public void destroy() {
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}

 

过滤器实现3
@WebFilter(urlPatterns = "/*", filterName = "myfilter")
public class FileterController implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter初始化中");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("开始进行过滤处理");
        //调用该方法后,表示过滤器经过原来的url请求处理方法
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {
        System.out.println("Filter销毁中");
    }
}

启动类
@SpringBootApplication
@ServletComponentScan

 

优先使用拦截器
依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。在实现上基于函数回调,可以对几乎所有请求进行过滤,
但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作。过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西,比如:在过滤器中修改字符编码;
在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
拦截器不依赖与servlet容器,依赖于web框架。在SpringMVC中就是依赖于SpringMVC框架,在SSH框架中,就是依赖于Struts框架。在实现上基于Java的反射机制,
属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用spring的依赖注入(DI)获取IOC容器中的各个bean(过滤器则不行),进行一些业务操作,
同时一个拦截器实例在一个controller生命周期之内可以多次调用

  

@Configuration
public abstract class MyTestConfig extends WebMvcConfigurationSupport {//implements WebMvcConfigurer

//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/zxc/foo").setViewName("foo");
//    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // addPathPatterns("/**") 表示拦截所有的请求,
        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
        //.addPathPatterns("/**").excludePathPatterns("/login", "/register");
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");///asd/**
    }
    }

public class MyInterceptor implements HandlerInterceptor {
    //在请求处理之前进行调用(Controller方法调用之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle被调用");
//        Map map =(Map)httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
//        System.out.println(map.get("name"));
//        System.out.println(httpServletRequest.getParameter("username"));
        if(1==1) {//map.get("name").equals("zhangsan")
            return true;    //如果false,停止流程,api被拦截
        }else {
            PrintWriter printWriter = httpServletResponse.getWriter();
            printWriter.write("please login again!");
            return false;
        }
    }
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被调用");
    }
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion被调用");
    }
}

******myfilter过滤器
preHandle被调用
hello********
postHandle被调用
afterCompletion被调用

  

@WebListener 未测试通过
创建监听器方式1   1.3.7版本
@WebListener//监听器注解
public class MyListener implements HttpSessionListener {
    private int onlineCount = 0;//记录session的数量
    /**
     * session被销毁时触发,如下情况
     * 		1.主动调用session.invalidate()
     * 		2.session超时
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session*****((((9");
        if (onlineCount > 0) {
            onlineCount--;
        }
        System.out.println("【HttpSessionListener监听器】 sessionDestroyed, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }
    //session被创建时触发
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session*****start");
        onlineCount++;
        System.out.println("【HttpSessionListener监听器】 sessionCreated, onlineCount:" + onlineCount);
        se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
    }
}

@SpringBootApplication(scanBasePackages="cn.com.xmh")
@ServletComponentScan

server.session.timeout=2  单位分钟

@RequestMapping("/hello")//测试
public @ResponseBody Object hello(HttpServletRequest request, Model model) {
System.out.println("hello********");
request.getSession().setAttribute("namme11","xmh");
return "hello";
}

创建监听器方式2
@Configuration
public abstract class MyTestConfig extends WebMvcConfigurationSupport {//implements WebMvcConfigurer

//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/zxc/foo").setViewName("foo");
//    }

//    @Override
//    public void addInterceptors(InterceptorRegistry registry) {
//        // addPathPatterns("/**") 表示拦截所有的请求,
//        // excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
//        //.addPathPatterns("/**").excludePathPatterns("/login", "/register");
//        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");///asd/**
//    }
//    @Bean
//    public FilterRegistrationBean filterRegist() {
//        FilterRegistrationBean frBean = new FilterRegistrationBean();
//        frBean.setFilter(new MyFilter());
//        frBean.addUrlPatterns("/*");
//        System.out.println("filter");
//        return frBean;
//    }
    @Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(new MyHttpSessionListener());

        System.out.println("listener");
        return srb;
    }
}

public class MyHttpSessionListener implements HttpSessionListener {
    public static int online = 0;
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("创建session********");
        online ++;
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("销毁session***********");
    }
}

  

WebMvcConfigurer 需要2.0.0.RELEASE版本 去掉eureka的pom配置,因为版本不兼容
@Configuration
public abstract class MyTestConfig implements WebMvcConfigurer{//implements WebMvcConfigurer  extends WebMvcConfigurationSupport

//    @Override
//    public void addViewControllers(ViewControllerRegistry registry) {
//        registry.addViewController("/zxc/foo").setViewName("foo");
//    }

    @Bean
    public ServletListenerRegistrationBean listenerRegist() {
        ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
        srb.setListener(new MyHttpSessionListener());

        System.out.println("listener");
        return srb;
    }
}

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.0.RELEASE</version><!--1.3.7 2.0.3 2.0.4-->
		<relativePath/>
	</parent>
	我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的客户端页面里使用js的window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁

  

 

 

 

posted @ 2019-04-14 11:02  苍天一穹  阅读(149)  评论(0)    收藏  举报