springboot拦截器

有些时候咱们的请求须要用拦截器去处理一下。

SpringBoot 拦截器也如其余功能同样,使用极简的脱离xml配置文件的方式,只须要简单几个类便可实现拦截。

如下为一个简单的示例,具体拦截器还需根据具体业务需求进行处理。是一个后台系统,验证登陆的拦截器。以前在其余项目中应该也有用到相似的,这里是SpringBoot的示例。


建立一个类继承WebMvcConfigurerAdapter,并重写addInterceptors方法,将咱们要进行拦截的方法配置到addPathPatterns方法的参数中,excludePathPatterns方法中是配置咱们不须要拦截的方法。

package com.inongfeng.shop.admin.interceptor;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter{

@Bean
public UserSecurityInterceptor userSecurityInterceptor(){
return new UserSecurityInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userSecurityInterceptor()).addPathPatterns("/**").excludePathPatterns("/Login");
super.addInterceptors(registry);
}

}

建立一个类实现HandlerInterceptor接口,并实现其中方法


preHandle:预处理回调方法,实现处理器的预处理(如登陆检查),第三个参数为响应的处理器 返回值: true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登陆检查失败),不会继续调用其余的拦截器或处理器,此时咱们须要经过response来产生响应;java

postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图以前),此时咱们能够经过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。web

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中咱们能够在此记录结束时间并输出消耗时间,还能够进行一些资源清理,相似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。spring

在这里咱们只需实现preHandle方法便可实现简单拦截。session


若是session中没有用户信息,则抛出登陆异常。

package com.inongfeng.shop.admin.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.inongfeng.shop.admin.common.dt.Constants;
import com.inongfeng.shop.admin.excepttion.LoginAuthException;

@Component
public class UserSecurityInterceptor implements HandlerInterceptor{

protected Logger logger = LoggerFactory.getLogger(getClass());

@Override
public void afterCompletion(HttpServletRequest req,HttpServletResponse resp, Object arg2, Exception arg3)throws Exception {

}

@Override
public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object arg2, ModelAndView arg3) throws Exception {

}

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception {

HttpSession session = request.getSession();
if(StringUtils.isEmpty(session.getAttribute(Constants.SessionUserInfo))){
throw new LoginAuthException(Constants.E_LoginError_OR_TimeOut);
}
return true;
}
}

}

上一步咱们抛出了登陆异常,可是还须要有地方去捕获这个异常。如下代码是一个全局捕获并处理异常的类。 若是捕获的是一个登陆异常,则返回让用户登陆。ide


package com.inongfeng.shop.admin.excepttion;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import com.inongfeng.shop.admin.common.dt.Constants;

@ControllerAdvice
public class GlobalExceptionHandler {

protected Logger logger = LoggerFactory.getLogger(getClass());

@ExceptionHandler(value = BaseException.class)
public Object baseErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if(e.getMessage().equals(Constants.E_LoginError_OR_TimeOut)){
if(logger.isDebugEnabled()){
e.printStackTrace();
logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {} ,登陆失败或超时", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return "login";
}else{
logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return e.getMessage();
}

@ExceptionHandler(value = Exception.class)
public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if(logger.isDebugEnabled()){
logger.error("---DefaultException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage());
}
return e.getMessage();
}
}
相关文章
相关标签/搜索