kotlin使用spring mvc(一)

过滤器Filter,是Servlet的一种技术。可通过Filter,对请求进行拦截,比如判断用户是否登录、验证黑名单等并且可对请求进行预处理。

接下来介绍使用WebFilter配置过滤器并实现读取cookie判断用户是否登陆

编写Filter类

/注册器名称为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注解,确保可以扫描到CustomFilter

@SpringBootApplication
@ServletComponentScan
class Demo1Application

fun main(args: Array<String>) {
    runApplication<Demo1Application>(*args)
}

随便请求一下,发现返回,我们的过滤器生效了

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格式,添加请求头

Accept: application/json

返回了我们想要的json

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(如下),那么就可以正常通过我们的过滤器了

Cookie: userid=3;

转载于:https://my.oschina.net/weidedong/blog/2248837

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值