【发布时间】:2012-03-27 01:41:51
【问题描述】:
我需要在调用控制器中的每个 def 之前执行一个函数(在每个新请求发送到服务器之前)。在这个函数中,我将 1) 进行会话检查是否有效,将请求转发到带有参数的适当操作和控制器 2)对用户提交的参数进行清理检查
我知道每个控制器拦截器,如何编写全局通用拦截器。
如何以及在哪里可以在 grails 中调用此函数? 提前谢谢..
【问题讨论】:
标签: grails request global intercept
我需要在调用控制器中的每个 def 之前执行一个函数(在每个新请求发送到服务器之前)。在这个函数中,我将 1) 进行会话检查是否有效,将请求转发到带有参数的适当操作和控制器 2)对用户提交的参数进行清理检查
我知道每个控制器拦截器,如何编写全局通用拦截器。
如何以及在哪里可以在 grails 中调用此函数? 提前谢谢..
【问题讨论】:
标签: grails request global intercept
您可以在 Controller 中使用 beforeInterceptor 来达到完全相同的目的。把它放到一个新的控制器中,比如 BaseController 并放入所有你想做的东西,然后用 BaseController 扩展你现有的所有控制器,你就可以开始了。更多关于 beforeInterceptor 的信息Click here
注意:如果您已经有一些通用的控制器被所有其他控制器扩展,则无需实现新的控制器。只需在该控制器本身中实现 beforeInterceptor。
或者,您可以实现一个过滤器并在该过滤器中执行所有操作。有关 Grails 中过滤器的更多信息Click Here
【讨论】:
您可以通过以下方式添加过滤器来拦截每个动作
class AbcFilters {
def filters = {
abc1(controller: '*', action: '*') {
}
abc2(controller: '*Test', action: '*') {
}
abc2(controllerExclude: 'AppStartup*', action: '*') {
}
}
}
【讨论】:
这是每个控制器中每个动作的过滤器:
all(controller: '*', action: '*') {
before = {
}
after = {
}
afterView = {
}
}
这是一个使用 Spring Security 的会话检查过滤器:
auditEntry(controller:'*', action:'*') {
before = {
if (session.isNew()){
def userName
def principal = SCH?.context?.authentication?.principal
if (principal instanceof String){
userName = principal
log.info "Anonymous user has logged into the application."
}else{
userName = principal?.username
log.info "User $userName has logged into the application."
log.debug (principal)
}
}
}
}
【讨论】: