一、prehandle的概念
prehandle的作用是在请求处理之前进行拦截和处理。在web开发中,我们常常需要在请求到达处理器之前进行一些统一的操作,比如身份验证、权限控制、日志记录等。prehandle在这些场景下发挥着至关重要的作用。
prehandle是Spring MVC框架中的一个重要组件,它通过拦截器实现。拦截器是一种类似于过滤器的组件,可以在请求到达处理器之前或处理器返回响应之前进行自定义的拦截和操作,比如检查当前用户是否登录,校验参数合法性等。
prehandle是Spring MVC框架中DispatcherServlet的重要生命周期回调方法之一,它在请求到达Controller之前调用。在DispatcherServlet的doDispatch方法中,会调用prehandle方法,如果所有拦截器的prehandle方法返回true,则表示允许请求继续执行,否则请求将被拦截停止。
二、prehandle的常见使用场景
1.全局异常处理
public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //处理异常 ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("errorPage"); return modelAndView; } } public class ExceptionHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //处理InterceptorException return true; } } @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Autowired private ExceptionHandlerInterceptor exceptionHandlerInterceptor; @Bean public GlobalExceptionHandler globalExceptionHandler() { return new GlobalExceptionHandler(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(exceptionHandlerInterceptor); } }
上面的代码中,ExceptionHandlerInterceptor是自定义的拦截器,用于在请求到达Controller之前,处理系统中抛出的异常。GlobalExceptionHandler是全局的异常处理器,用于将系统中发生的异常转化为友好的提示信息。通过将ExceptionHandlerInterceptor添加到WebConfig的InterceptorRegistry中,可以让该拦截器生效,并在prehandle方法中进行异常处理。
2.登录验证
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getSession().getAttribute("user") == null) { response.sendRedirect("/login"); return false; } return true; } } @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Autowired private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login"); } }
在上面的代码中,LoginInterceptor是自定义的拦截器,用于在请求到达Controller之前,检查当前是否已经登录。如果当前用户未登录,则将请求重定向到登录页面。通过将LoginInterceptor添加到WebConfig的InterceptorRegistry中,可以让该拦截器生效,并在prehandle方法中进行登录校验。
三、prehandle的使用注意事项
1.拦截器的执行顺序
在Spring MVC框架中,我们可以同时使用多个自定义的拦截器来处理请求,在这种情况下,Spring MVC框架会按照拦截器的配置顺序逐个执行prehandle方法,如果有任意一个拦截器的prehandle方法返回false,则整个请求将被拦截停止。
在通常情况下,我们应该将拦截器以及其他组件(比如过滤器、监听器等)的执行顺序都考虑好,确保不会出现因为顺序不当而导致的问题。
2.拦截器中抛出异常的处理
在拦截器的prehandle方法中,如果发生了异常,我们需要有一个良好的处理机制来处理这些异常。通常情况下,我们会将异常转化为友好的提示信息,并将请求重定向到错误页面或者是上一个页面。
另外,如果拦截器无法处理当前请求,我们也需要有一个机制来让拦截器生效。这种情况下,我们可以将整个项目设置为生产模式,这样Spring MVC框架就会忽略自定义的异常,而是使用默认的异常处理机制。
四、总结
prehandle是Spring MVC框架中的一个非常重要的组件,通过prehandle我们可以在请求到达处理器之前进行拦截和处理,实现一些统一的操作,比如身份验证、权限控制、日志记录等。在使用prehandle时,我们需要注意拦截器的执行顺序,以及拦截器中抛出异常的处理。