请看以下内容:
SpringMvc自定义拦截器(注解)代码实例
在 SpringMVC 中,拦截器(Interceptor)是一个非常重要的组件,它可以在请求处理的前、后或中间加入自己的业务逻辑,例如身份认证、日志记录等。本文将详细介绍如何使用注解的方式自定义 SpringMVC 拦截器,并提供两个示例来说明其使用方法。
1. 创建拦截器类
创建一个拦截器类需要实现 HandlerInterceptor
接口,它包括前置处理、后置处理和完成处理三个方法。在注解方式中,我们可以使用 @Interceptor
注解来指定拦截器对应的路径。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Interceptor("/admin/*")
public class AdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 前置处理逻辑
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 后置处理逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 完成处理逻辑
}
}
上面的示例中,我们创建了一个名为 AdminInterceptor
的拦截器类,并使用注解 @Interceptor("/admin/*")
指定了其拦截的路径为 /admin/*
。
2. 注册拦截器类
在 SpringMVC 的配置文件中,我们需要将上面创建的拦截器类注册到拦截器链中,这样才能在请求处理中使用它。
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/**"/>
<bean class="com.example.AdminInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
上面的示例中,我们使用 mvc:interceptors
标签来定义拦截器链,然后在其中添加一个拦截器。使用 mvc:mapping
标签指定拦截器对应的路径,使用 bean
标签指定拦截器类的实现。在拦截器链中可以添加多个拦截器,按照注册的顺序依次执行。
3. 使用拦截器类
使用自定义的拦截器需要在需要拦截的方法或类上添加 @Interceptors
注解,并指定其对应的拦截器类。
@Interceptors(AdminInterceptor.class)
public class AdminController {
@RequestMapping("/add")
public String add(Model model) {
// 添加逻辑
return "success";
}
}
上面的示例中,我们使用 @Interceptors
注解来指定 AdminController
类对应的拦截器类为 AdminInterceptor
。在拦截器链中,只有匹配到对应路径的请求才会触发拦截器类中的方法。
示例1:身份认证拦截器
我们以身份认证拦截器为例,实现用户登录状态检测。在用户进行相关操作之前,需要先进行身份验证,只有通过验证才能进行后续操作。如果用户未登录或登录状态已过期,则需要跳转到登录页面进行登录。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Interceptor("/")
public class AuthenticationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String uri = request.getRequestURI();
HttpSession session = request.getSession();
if (uri.equals("/login")) {
return true;
}
if (session.getAttribute("userId") == null) {
try {
response.sendRedirect("/login");
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
return true;
}
}
上面的示例中,我们通过 HttpSession
获取用户登录状态,如果未登录或登录状态已过期,则跳转到登录页面。注意,在注册拦截器类时,我们将其对应的路径设置为 /
,这样可以拦截所有请求。
示例2:日志记录拦截器
我们以日志记录拦截器为例,记录用户的访问记录。在用户访问相关页面时,进行日志记录,记录用户的 IP 地址、访问时间、访问路径等信息。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Interceptor("/admin/*")
public class LoggingInterceptor implements HandlerInterceptor {
private Logger logger = Logger.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
logger.info("IP: " + request.getRemoteAddr() + " Start visit " + request.getRequestURI() + " At " + new Date());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
logger.info("IP: " + request.getRemoteAddr() + " End visit " + request.getRequestURI() + " At " + new Date());
}
}
上面的示例中,我们使用 Logger
记录用户的访问记录。在请求处理前进行访问记录的开始记录,在完成处理时进行结束记录。注意,在注册拦截器类时,我们将其对应的路径设置为 /admin/*
,这样可以拦截 /admin
路径下的所有请求。
总结
以上就是使用注解方式自定义 SpringMVC 拦截器的详细攻略。在实际开发过程中,应该根据具体的需求来编写对应的拦截器类。拦截器是一个非常灵活的组件,在正确使用它的情况下,可以提高代码的可维护性和安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMvc自定义拦截器(注解)代码实例 - Python技术站