SpringBoot 拦截器、过滤器、监听器、定时器使用

2,490 阅读2分钟
一、application.java中配置

@EnableTransactionManagement
自动启用事务
@SpringBootApplication
@MapperScan(basePackages={"com.hxkj.waychat.dao"})
@ServletComponentScan
拦截器、过滤器、监听器的注解配置

二、监听器配置

package com.hxkj.waychat.intercept.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hxkj.waychat.core.config.Constant;
import com.hxkj.waychat.core.utils.PropertiesUtils;

@WebListener
public class ThymeleafServletContextListener implements ServletContextListener {

	private static Logger logger = LoggerFactory.getLogger(ThymeleafServletContextListener.class);
	
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		logger.info("----------:ServletContext销毁");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		logger.info("----------:ServletContext初始化");
		logger.info("----------:baseUrl:"+PropertiesUtils.getPropertiesValue(Constant.BASE_URL)+";fileUrl:"+PropertiesUtils.getPropertiesValue(Constant.FILE_URL));
		arg0.getServletContext().setAttribute("baseUrl", PropertiesUtils.getPropertiesValue(Constant.BASE_URL));
		arg0.getServletContext().setAttribute("fileUrl", PropertiesUtils.getPropertiesValue(Constant.FILE_URL));
	}

}

三、过滤器配置

package com.hxkj.waychat.intercept.fliter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*@WebFilter(filterName="MyFilter",urlPatterns="/*")*/
public class MyFilter implements Filter {

	private static Logger logger = LoggerFactory.getLogger(MyFilter.class);
	
	@Override
	public void destroy() {
		logger.info("----------:过滤器销毁");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		logger.info("----------:过滤器执行内容");
		
		arg2.doFilter(arg0, arg1);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		logger.info("----------:过滤器初始化");
	}

}

四、拦截器配置


1.spring boot拦截器默认有 

HandlerInterceptorAdapter

AbstractHandlerMapping

UserRoleAuthorizationInterceptor

LocaleChangeInterceptor

ThemeChangeInterceptor

2.配置spring mvc的拦截器WebMvcConfigurerAdapter 

public class WebAppConfig extends WebMvcConfigurerAdapter
3.实现添加拦截器方法 

public void addInterceptors(InterceptorRegistry registry){

}
registry.addInterceptor可以通过此方法添加拦截器, 可以是spring提供的或者自己添加的
4.实例部分 

public class WebAppConfig extends WebMvcConfigurerAdapter{	
    public static void main(String[] args) {
		SpringApplication.run(WebAppConfig.class, args);
	} 
    
    /**
     * 配置拦截器
     * @author lance
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {
    	registry.addInterceptor(new UserSecurityInterceptor()).addPathPatterns("/user/**");
	}
}

UserSecurityInterceptor代码
public class UserSecurityInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
        
        return true;
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {

	}

}

五、定时器使用

@Component  
public class Scheduler {  
    private final Logger logger = LoggerFactory.getLogger(this.getClass());  
      
    @Scheduled(cron="0 0/1 * * * ?") //每分钟执行一次  
    public void statusCheck() {      
        logger.info("每分钟执行一次。开始……");  
        //statusTask.healthCheck();  
        logger.info("每分钟执行一次。结束。");  
    }    
  
    @Scheduled(fixedRate=20000)  
    public void testTasks() {      
        logger.info("每20秒执行一次。开始……");  
        //statusTask.healthCheck();  
        logger.info("每20秒执行一次。结束。");  
    }    
}  

六、全局异常处理器使用

package com.hxkj.fsslr.controller;

import java.io.FileNotFoundException;

import javax.lang.model.type.UnknownTypeException;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.hxkj.fsslr.core.utils.PageReturnUtils;

/**
 * @ClassName: GlobalExceptionHandler 
 * @Description: 全局异常处理
 * @author huzhihui_c@qq.com
 * @date 2016年7月18日 下午1:17:59
 */
@ControllerAdvice
public class GlobalExceptionHandler {

	private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
	
	@ExceptionHandler(value=Exception.class)
	@ResponseBody
	public Object errorHandler(HttpServletRequest request,Exception e){
		logger.info("-----捕获到异常-----");
		//ajax请求异常返回
		if(null != request.getHeader("X-Requested-With") && "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString())){
			if (e instanceof NullPointerException) {
				return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, "数据参数传入错误");
			} else if (e instanceof FileNotFoundException) {
				return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, "数据文件上传出错");
			} else if (e instanceof ClassNotFoundException) {
				return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, "系统未找到该jar包");
			} else if (e instanceof UnknownTypeException) {
				return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, "未知错误");
			} else{
				return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, e.toString());
			}
		}
		return PageReturnUtils.formatNormal("", PageReturnUtils.MSG_CODE_111111, PageReturnUtils.MSG_STATE_FALSE, e.toString());
	}
}