过滤器Filter,是Servlet的一种技术。可经过Filter,对请求进行拦截,好比判断用户是否登陆、验证黑名单等而且可对请求进行预处理。java
接下来介绍使用WebFilter配置过滤器并实现读取cookie判断用户是否登录json
编写Filter类cookie
/注册器名称为customFilter,拦截的url为全部 @WebFilter(filterName = "customFilter",urlPatterns = ["/*"]) class CustomFilter:Filter { var logger = LoggerFactory.getLogger(this::class.java)!! override fun destroy() { logger.info("CustomFilter destroy") } override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain?) { 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 } } logger.info("CustomFilter start") chain?.doFilter(request,response) logger.info("CustomFilter complete") } override fun init(filterConfig: FilterConfig?) { logger.info("CustomFilter init") } }
而后在启动类加入@ServletComponentScan注解,确保能够扫描到CustomFilterapp
@SpringBootApplication @ServletComponentScan class Demo1Application fun main(args: Array<String>) { runApplication<Demo1Application>(*args) }
随便请求一下,发现返回,咱们的过滤器生效了ide
HTTP/1.1 200 Content-Type: */*;charset=ISO-8859-1 Content-Length: 15 Date: Thu, 18 Oct 2018 07:23:58 GMT No Access Token
那么试一下接受json格式,添加请求头this
Accept: application/json
返回了咱们想要的jsonurl
HTTP/1.1 200 Content-Type: application/json;charset=ISO-8859-1 Content-Length: 52 Date: Thu, 18 Oct 2018 07:27:08 GMT {"data":null,"succes":false,"msg":"No Access Token"}
若是加上Cookie(以下),那么就能够正常经过咱们的过滤器了code
Cookie: userid=3;