在实际开发过程中,我们的项目要给某些特定的用户来使用或者调用。在调用过程中,会让其传递某些标识,验证通过之后,才让其调用接口或者访问系统。常用的方法是在项目中加入一个拦截器,在用户调用接口之前,就验证其是否合法,做法是在header中传递一下标识,让拦截器进行处理。
简要的拦截器实现如下:
1、新建一个拦截器,让其集成HandlerInterceptorAdapter()这个类,让后实现里面的preHandle方法,也就是在请求之前拦截。
import com.fasterxml.jackson.databind.ObjectMapper
import net.tiangu.aio.commons.exception.ApiException
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.mongodb.core.MongoTemplate
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
import org.springframework.http.MediaType
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
class ApiInterceptor : HandlerInterceptorAdapter() {
@Autowired
lateinit private var mongoTemplate: MongoTemplate
override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
try {
val appId = if (request.getHeader("RAINBOW-DEBUG") != "true") {
request.getHeader("RAINBOW-APP-ID") ?: throw ApiException("0001", "参数 appId 不能为空")
} else {
"123456"
}
request.setAttribute("appId ", appId )
return true
} catch (ex: ApiException) {
response.status = 400
response.contentType = MediaType.APPLICATION_JSON_UTF8_VALUE
val stream = response.outputStream
stream.write(ObjectMapper().writeValueAsBytes(mapOf("code" to ex.code, "message" to (ex.message ?: "未知错误"))))
stream.flush()
stream.close()
return false
}
}
}
2、注册拦截器。为了能够让该拦截器生效,需要注册拦截器。
新建一个ApilicationConfig,并让该类继承WebMvcConfigurerAdapter()类,并在里面实现addInterceptors方法。
import net.tiangu.aio.interceptor.ApiInterceptor
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
/**
* Created by rainbow on 2017/4/28.
*一事专注,便是动人;一生坚守,便是深邃!
*/
@Configuration
open class ApplicationConfig : WebMvcConfigurerAdapter() {
@Bean
open fun apiInterceptor() = ApiInterceptor()
//可注册多个拦截器
override fun addInterceptors(registry: InterceptorRegistry) {
//拦截/api/v1/下的所有方法
registry.addInterceptor(apiInterceptor()).addPathPatterns("/api/v1/**")
}
}
网友评论