关于过滤器
在 Grails 3.0 之前的 Grails 版本中,Grails 支持过滤器的概念。这些仍受向后兼容性支持,但已被视为已弃用。
Grails 3.0 中的新拦截器概念在很多方面都很优越,最重要的是拦截器可以使用 Groovy 的CompileStatic注释来优化性能(这通常很关键,因为可以针对每个请求执行拦截器。)
生成拦截器
通过命令自动创建拦截器
create-interceptor ApiInterceptor
初始化会生成三个方法
测试写了几个获取方式,获取到拦截的信息
package cmsweb
import grails.plugin.springsecurity.SpringSecurityUtils
import org.springframework.security.core.context.SecurityContextHolder
class ApiInterceptor {
ApiInterceptor() {
matchAll()//拦截所有请求
}
boolean before() {
println("拦截器进入before")
if (SpringSecurityUtils.ifAnyGranted("ROLE_ADMIN")) {
println('ROLE_ADMIN角色访问')
}
if (SpringSecurityUtils.ifAnyGranted("ROLE_USER")) {
println('ROLE_USER角色访问')
println('request.getRequestURL()' + request.getRequestURL())
println('params' + params)
println('request.getMethod()' + request.getMethod())
println('request.getLocalAddr()' + request.getLocalAddr())
println('request.getHeader(\'X-Api-Token\')' + request.getHeader('X-Api-Token'))
println('getAuthentication-->' + SecurityContextHolder.context.getAuthentication())
println('username-->' + SecurityContextHolder.context.getAuthentication().principal.getAt('username'))
}
return true
}
boolean after() {//在操作执行之后但在视图渲染之前执行
println("拦截器进入after")
if (SpringSecurityUtils.ifAnyGranted("ROLE_ADMIN")) {
println('ROLE_ADMIN角色访问')
}
if (SpringSecurityUtils.ifAnyGranted("ROLE_USER")) {
println('ROLE_USER角色访问')
}
return true
}
void afterView() {//视图渲染完成后执行
println("拦截器进入afterView")
Throwable thr = getThrowable();//获取action执行抛出的异常
if (thr) {
println("拦截器进入getThrowable,捕获action执行抛出的异常")
render template: "/viewGson/status", model: [code : 500,
message : '系统出现异常,请联系系统技术支持'
, listMap: []]
}
}
}