我正在开发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并返回,而不是我在上面的代码中完成了它。我不想在开头为每个控制器方法编写相同的代码。
所以请建议我另一种方式
答案 0 :(得分:1)
这些是几种解决方案。正如@chrylis指出的那样,你可以使用@ControllerAdvice
,HandlerInterceptor
甚至普通的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";
});
}