检查每个控制器方法的请求参数开头

时间:2016-01-01 18:28:29

标签: spring spring-mvc

我正在开发spring mvc项目。在每个控制器中,我有多个方法分配给特定的URL。 e.g。

@RequestMapping(value = "/accountDetails")
public String home(HttpServletRequest request){
    Book book = (Book) request.getSession().getAttribute("Book");
    if (book == null) return "redirect:/";
    //other things to do here
    return "home";
}

这里我想检查会话变量Book是否为空或在每个方法的开头。如果它返回/以其他方式进行某些操作。

有没有其他方法可以检查此null并返回,而不是我在上面的代码中完成了它。我不想在开头为每个控制器方法编写相同的代码。

所以请建议我另一种方式

1 个答案:

答案 0 :(得分:1)

这些是几种解决方案。正如@chrylis指出的那样,你可以使用@ControllerAdviceHandlerInterceptor甚至普通的Filter(或者它的DelegatingFilterProxy Spring风味)作为通用的交叉切割解决方案。根据您当前的项目设置和您的要求,可能比另一个更容易实现,它可能或可能不适合您的需求,因此请务必阅读文档并确定它是否符合您的目的。

使用完全编程解决方案的另一种方法是将一个带有Java 8 lambda的实用程序方法用于要在book可用的情况下执行的代码块。

public static String withBook(Function<Book, String> bookOperation) {
    Book book = (Book) RequestContextHolder
            .currentRequestAttributes()
            .getAttribute("Book", RequestAttributes.SCOPE_SESSION);
    if (book == null) {
        return "redirect:/";
    } else {
        return bookOperation.apply(book);
    }
}

RequestContextHolder使您可以访问当前请求和会话的属性。

您可以使用此实用程序方法:

@RequestMapping(value = "/accountDetails")
public String home() {
    return withBook(book -> {
        // just implement the part where book is not null
        return "home";
    });
}