Java拦截器简单使用
拦截器(Interceptor)是在程序处理请求和发送响应之前,可以截获、处理请求以及处理响应的一种机制。在Java中,拦截器通常用于对请求和响应进行预处理或后处理,以便在实际处理业务逻辑之前或之后执行特定的操作。
- 为什么使用拦截器?
拦截器是实现面向切面编程(AOP)的一种方式,可以用于:
日志记录:记录请求信息、响应时间等。
权限验证:在请求到达业务逻辑之前,验证用户是否有权限执行该操作。
异常处理:在处理业务逻辑时,捕获并处理异常,以提高系统的稳定性。
缓存:在拦截器中检查缓存,如果缓存中存在所需数据,则直接返回,而不需要访问数据库。
-
Java中的拦截器
在Java中,拦截器主要应用于框架和技术,例如Spring MVC、Servlet、Struts等。本文将以Spring MVC框架为例介绍如何简单使用拦截器。 -
创建一个拦截器类
首先,我们需要创建一个实现了HandlerInterceptor接口的拦截器类。这个接口包含了三个方法:
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Autowired
private SUserInfoService sUserInfoService;
/**
* controller 请求前运行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1、获取请求路径
String url = request.getRequestURL().toString();
log.info("请求的url:{}", url);
// 2、判断当前请求路径是否包含登录 如果包含登录放行
if (url.contains("login")) {
log.info("登录操作 放行...");
return true;
}
// 3、获取登录的令牌(token)
String token = request.getHeader("token");
// 4、判断令牌是否存在
if (!StringUtils.hasLength(token)) {
log.info("请求头openId为空,返回未登录提示");
R error = R.error(ResultCode.UNAUTHORIZED, "未登录");
String notLogin = JSONObject.toJSONString(error);
response.getWriter().write(notLogin);
return false;
}
// 5、解析令牌,如果解析失败、返回错误结果(未登录)
try {
SUserInfo userInfo = sUserInfoService.getOne(new QueryWrapper<SUserInfo>().eq("token", token));
if (ObjectUtils.isEmpty(userInfo)) {
return false;
}
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败,返回未登录信息");
R error = R.error(ResultCode.UNAUTHORIZED, "未登录");
String notLogin = JSONObject.toJSONString(error);
response.getWriter().write(notLogin);
return false;
}
// 6、放行
log.info("令牌合法,放行");
return true;
}
/**
* 后处理回调方法
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
/**
* 操作成功后处理的方法
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}
4、创建一个WebConfig配置类
创建一个实现了WebMvcConfigurer 接口的拦截器类。这个接口包含了addInterceptors方法
// 配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* addInterceptor 添加拦截器 loginCheckInterceptor
* addPathPatterns 添加拦截路径 /** 拦截所有
* excludePathPatterns 排除拦截路径
*/
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login");
}
}
至此就实现了一个简单的拦截器