Java Spring拦截器是一种常用的拦截器技术,它可以在请求到达Controller之前或之后执行一些操作,比如记录日志、权限认证、参数校验等。本文将详细讲解Java Spring拦截器的使用方法和示例。
1. 创建拦截器
首先,我们需要创建一个拦截器。我们可以创建一个名为MyInterceptor的拦截器,并实现HandlerInterceptor接口。
下面是一个示例,演示了如何创建一个拦截器:
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求到达Controller之前执行的操作
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在请求到达Controller之后,视图渲染之前执行的操作
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在请求完成之后执行的操作,一般用于资源清理
}
}
在上面的代码中,我们创建了一个名为MyInterceptor的拦截器,并实现了HandlerInterceptor接口。在preHandle方法中,我们可以执行一些在请求到达Controller之前需要执行的操作。在postHandle方法中,我们可以执行一些在请求到达Controller之后,视图渲染之前需要执行的操作。在afterCompletion方法中,我们可以执行一些在请求完成之后需要执行的操作,一般用于资源清理。
2. 配置拦截器
接下来,我们需要配置拦截器。我们可以在WebMvcConfigurer接口的实现类中添加拦截器,并指定拦截器的拦截路径。
下面是一个示例,演示了如何配置拦截器:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
在上面的代码中,我们创建了一个名为WebMvcConfig的配置类,并实现了WebMvcConfigurer接口。在addInterceptors方法中,我们添加了一个名为MyInterceptor的拦截器,并指定了拦截路径为"/**",表示拦截所有请求。
示例说明
下面是两个示例,演示了如何使用Java Spring拦截器:
示例一:记录请求日志
在这个示例中,我们将记录请求日志。我们可以在MyInterceptor拦截器的preHandle方法中记录请求的URL、请求参数、请求时间等信息。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
String method = request.getMethod();
String queryString = request.getQueryString();
String remoteAddr = request.getRemoteAddr();
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
// 记录请求日志
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long startTime = (long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
// 记录响应日志
}
}
在上面的代码中,我们在preHandle方法中记录了请求的URL、请求参数、请求时间等信息,并将请求开始时间保存在request的属性中。在afterCompletion方法中,我们计算了请求的执行时间,并记录了响应的相关信息。
示例二:权限认证
在这个示例中,我们将进行权限认证。我们可以在MyInterceptor拦截器的preHandle方法中判断用户是否有权限访问该请求,如果没有权限,则返回错误信息。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token == null || !token.equals("123456")) {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":401,\"message\":\"Unauthorized\"}");
return false;
}
return true;
}
}
在上面的代码中,我们在preHandle方法中判断了用户是否有权限访问该请求,如果没有权限,则返回了一个错误信息。在这个示例中,我们假设用户需要在请求头中添加一个名为Authorization的参数,并且该参数的值为123456。如果用户没有添加该参数或者参数的值不为123456,则认为用户没有权限访问该请求,返回一个401错误信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Spring拦截器案例详解 - Python技术站