使用Interceptor拦截器java
Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。而拦截器是在 Spring容器内的,是Spring框架支持的。Filter在只在 Servlet 先后起做用。Filters 一般将 请求和响应(request/response) 当作黑盒子,Filter一般不考虑servlet 的实现。拦截器可以深刻到方法先后、异常抛出先后等,所以拦截器的使用具备更大的弹性。容许用户介入请求的生命周期,在请求过程当中获取信息,Interceptor 一般和请求更加耦合。在Spring构架的程序中,要优先使用拦截器。几乎全部 Filter 可以作的事情,interceptor 都可以轻松的实现。web
下面咱们实现以前用Filter实现的验证登录程序spring
import org.slf4j.LoggerFactory import org.springframework.http.MediaType import org.springframework.web.servlet.HandlerInterceptor import org.springframework.web.servlet.ModelAndView import java.lang.Exception import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse class CustomInterceptor: HandlerInterceptor{ var logger = LoggerFactory.getLogger(this::class.java)!! //在请求处理以前进行调用 override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean { val httpServletRequest = request as? HttpServletRequest if (httpServletRequest != null && response != null) { //获取用户cookie val userCookie = httpServletRequest.cookies?.firstOrNull { it.name?.toLowerCase() == "userid" } //检查cookie的正确性 val userId = userCookie?.value?.toIntOrNull() ?: 0 if(userId <= 0){ val accept = httpServletRequest.getHeader("Accept") if (accept?.contains("json") == true) { response.contentType = MediaType.APPLICATION_JSON_VALUE val str = ObjectMapperExtension.instance.writeValueAsString(CommonResult(null, false, "No Access Token")) response.writer.print(str) } else { response.contentType = MediaType.ALL_VALUE response.writer.print("No Access Token") } return false } } logger.info("CustomInterceptor") return true } //请求处理以后进行调用,可是在视图被渲染以前(Controller方法调用以后) override fun postHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any, modelAndView: ModelAndView?) { logger.info("postHandle") } //在整个请求结束以后被调用,也就是在DispatcherServlet 渲染了对应的视图以后执行(主要是用于进行资源清理工做) override fun afterCompletion(request: HttpServletRequest, response: HttpServletResponse, handler: Any, ex: Exception?) { logger.info("afterCompletion") } }
import org.springframework.context.annotation.Configuration import org.springframework.web.servlet.config.annotation.InterceptorRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer @Configuration class MyWebMvcConfigurerAdapter: WebMvcConfigurer { override fun addInterceptors(registry: InterceptorRegistry) { registry.addInterceptor(CustomInterceptor()) //注册要拦截的url .addPathPatterns("/*") //排除url .excludePathPatterns("/login") } }