过滤器实现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,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,自动销毁