如何在每个新请求提交到grails中的控制器之前执行函数
我需要在调用控制器中的每个def之前(在向服务器发送每个新请求之前)执行一个函数。在这个函数中,我将 1) 执行会话检查是否有效,并使用参数将请求转发到相应的操作和控制器 2) 对用户提交的参数执行消毒检查 我知道每个控制器拦截器,如何编写全局通用拦截器 在grails中如何以及在何处调用此函数?如何在每个新请求提交到grails中的控制器之前执行函数,grails,request,global,intercept,Grails,Request,Global,Intercept,我需要在调用控制器中的每个def之前(在向服务器发送每个新请求之前)执行一个函数。在这个函数中,我将 1) 执行会话检查是否有效,并使用参数将请求转发到相应的操作和控制器 2) 对用户提交的参数执行消毒检查 我知道每个控制器拦截器,如何编写全局通用拦截器 在grails中如何以及在何处调用此函数? 提前感谢。您可以在控制器中使用beforeInterceptor来实现完全相同的目的。把它放到一个新的控制器中,比如说BaseController,然后放入所有你想做的事情,然后用BaseContro
提前感谢。您可以在控制器中使用beforeInterceptor来实现完全相同的目的。把它放到一个新的控制器中,比如说BaseController,然后放入所有你想做的事情,然后用BaseController扩展所有现有的控制器,你就可以开始了。有关beforeInterceptor的详细信息 注意:如果您已经有了一些通用控制器,可以由所有其他控制器扩展,则无需实施新的控制器。只需在该控制器本身中实现beforeInterceptor
或者,您可以实现一个过滤器,并在该过滤器中完成所有工作。有关Grails中过滤器的更多信息,可以通过以下方式添加过滤器来拦截每个操作
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)
}
}
}
}
谢谢Bala,现在我正在考虑过滤器的问题,我刚刚阅读了文档,但是如何为除AppStartupController(所有defs)之外的所有控制器制作过滤器,因为会话在该控制器中还不可用。。。然后在登录控制器中验证def(登录控制器-注销def中的另一个def需要进行会话检查)。如何编写此筛选器?可以使用以下语法排除某些控制器筛选器1(控制器:'book',反转:true){}。这将对除book controller(BookController)之外的所有控制器请求执行filter1。希望这有帮助。谢谢你的帮助,我现在正在通过创建一个抽象的基本控制器来实现这一点,并让所有人都对它进行扩展。在这里,我可以使用beforeInterceptor来调用函数。当然可以,我认为过滤器是一种更干净的方式。