springboot基于HandlerInterceptor实现拦截

  1. 新建Class,并且实现 HandlerInterceptor

  1. preHandle 完成相应的规则判断

通过该方法,可以实现对指定请求之外的请求实施拦截。也可以和redis一起组合实现多端同时在线或者不可同时在线的功能

//在请求处理之前进行调用(Controller方法调用之前

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

// System.out.println("preHandle被调用");

// 所有请求第一个进入的方法

String reqURL = httpServletRequest.getRequestURL().toString();

String ip = httpServletRequest.getRemoteHost();

if (o instanceof HandlerMethod) {

HandlerMethod h = (HandlerMethod) o;

// //app session认证,如果是app端请求,且session为空,则请求拦截

if(httpServletRequest.getRequestURI().indexOf("/app/") != -1 && !FilterPath.findFilterPath().contains(httpServletRequest.getServletPath())){

String sessionId = httpServletRequest.getHeader("sessionId");

if(StringUtils.isNotNull(sessionId) && redisUtils.hasKey(sessionId)){

//请求成功,则重新设置时间

// redisUtils.set(sessionId, UUID.randomUUID().toString().replace("-", "").toString()+ "_" +DateUtils.getTime(),432000L);

redisUtils.set(sessionId, StringUtils.substringBefore(redisUtils.get(sessionId).toString(),"_")+ "_" +DateUtils.getTime(),432000L);

//用户在线更新

String userId = sessionId.substring(sessionId.indexOf("_") + 1, sessionId.lastIndexOf("_"));

if(StringUtils.isNotEmpty(userId)){

redisUtils.set("userOnLine:userOnLine_" + userId, userId, 900L);

}

}else{

returnMsg(httpServletResponse,"please_re_login");

return false;

}

}

if(Global.getRequestLog()){

logger.info("-------------------------------------" + DateUtils.dateTimeNow("yyyy-MM-dd HH:mm:ss") + "------------------------------");

logger.info("Controller : " + h.getBean().getClass().getName());

StringBuilder sb = new StringBuilder();

sb.append(h.getBean().getClass().getName()).append(".(").append(h.getBean().getClass().getSimpleName()).append(".java:1)");

logger.info("Class : " + sb.toString());

logger.info("请求路径 : " + httpServletRequest.getServletPath());

logger.info("方法名称 : " + h.getMethod().getName());

logger.info("请求方式 : " + httpServletRequest.getMethod());

logger.info("请求参数 : " + getParamString(httpServletRequest.getParameterMap()));

logger.info("URL : " + reqURL);

logger.info("请求方ip : " + ip);

logger.info("---------------------------------------------------------------------------------------");

}

}

return true;

}


请作者喝咖啡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以通过拦截实现登录拦截。下面是一个简单示例: 1. 创建一个拦截器类,实现`HandlerInterceptor`接口: ```java import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截,可以在这里进行登录校验等操作 // 如果未登录,可以通过response.sendRedirect()跳转到登录页 // 返回false表示拦截请求,不再继续处理 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 { // 整个请求完成之后调用,可用于清理资源等操作 } } ``` 2. 创建一个配置类,注册拦截器: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册拦截器,并设置拦截路径 registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**"); } } ``` 在这个示例中,拦截器被注册为全局拦截器,会对所有请求进行拦截。你可以根据需要修改拦截路径。 这样,当请求进来时,会先经过拦截器的`preHandle`方法进行拦截处理。如果返回`false`,则请求不会继续处理,如果返回`true`,则请求会继续传递给下一个拦截器或处理器进行处理。 注意:以上示例是基于Spring MVC的Web应用程序。如果你使用的是Spring Boot的WebFlux框架,需要使用`WebFluxConfigurer`接口和`addInterceptors`方法来实现拦截器的注册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值