SpringMVC拦截器可以用于拦截处理请求的Controller,对请求进行预处理和后处理,比如记录日志、登录校验、权限校验等操作。下面是这个主题的完整攻略:
概述
SpringMVC拦截器由HandlerInterceptor接口定义,有三个主要的方法:preHandle、postHandle和afterCompletion。
-
preHandle方法:该方法在处理请求前被调用,可以用于对请求进行预处理,比如进行登录校验、记录日志等操作。如果该方法返回值为true,则继续处理请求;如果返回值为false,则不再继续处理请求。
-
postHandle方法:该方法在请求处理之后被调用,但是DispatcherServlet渲染视图之前被调用,这使得我们可以在这个方法里面对模型数据进行处理或者对视图进行处理。但是这个方法并没有对请求的结果进行响应,也就是说你可以在这个方法里面修改响应结果,但是SpringMVC不会利用它来处理响应结果。
-
afterCompletion方法:该方法在DispatcherServlet完成视图渲染之后被调用,用于进行资源清理操作。
使用方法
在使用SpringMVC拦截器时,需要定义拦截器并把它添加到拦截器链中。
- 定义拦截器
定义一个拦截器类实现HandlerInterceptor接口,然后实现三个方法:
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// TODO: 登录拦截逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// TODO: 处理模型数据或者视图
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// TODO: 资源清理操作
}
}
- 配置拦截器
将定义好的拦截器添加到拦截器链中:
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**");
}
}
上面的代码中,我们定义了一个WebMvcConfigurer类并继承了WebMvcConfigurerAdapter,然后将登录拦截器添加到拦截器链中。
- 运行效果
在定义好拦截器并将其添加到拦截器链中后,我们就可以看到拦截器的控制效果。下面是两个大致的拦截器示例:
示例1:记录请求日志
@Component
public class LogInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LogInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("Request URL: {}", request.getRequestURL().toString());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("Response Status: {}", response.getStatus());
}
}
示例2:登录校验拦截器
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User)request.getSession().getAttribute("user");
if(user != null) {
return true;
}
response.sendRedirect("/login");
return false;
}
}
上面的代码中,我们定义了一个LogInterceptor拦截器,在preHandle方法中记录了请求URL,在afterCompletion方法中记录了响应状态码。
另外,我们还定义了一个LoginInterceptor拦截器,在preHandle方法中进行了登录校验,如果用户未登录则跳转到登录页面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC拦截器零基础掌握 - Python技术站