springboot2.0我们可以继承接口HandlerInterceptor编写拦截器,实现对登录状态失效的用户进行操作拦截。
import com.shengxi.rs.common.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* @author matthew
* @Date: 2019年6月27日 17:41:24
* @Description: 登陆验证拦截
*/
@Component
public class LoginStatusFilter implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LoginStatusFilter.class);
/**
* 请求进去controller进行请求拦截
* 验证是否登录
*
* @param request req
* @param response resp
* @param handler handler
* @return boolean
* @throws Exception exception
* @Description: 请求登陆验证是否处于登录状态
* @since 1.0
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = TokenFilter.getToken(request);
if (StringUtils.isNull(token)) {
response.setStatus(203);
//未登录自动跳转界面
logger.info("用户没有登录,重定向登陆页面");
response.sendRedirect("/");
return false;
}
//在请求处理之前进行调用(Controller方法调用之前)
// 只有返回true才会继续向下执行,返回false取消当前请求
return true;
}
/**
* 请求进入controller后调用
*
* @param request request
* @param response response
* @param handler handler
* @param modelAndView modelAndView
* @throws Exception Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 请求得到响应的时候调用
*
* @param request request
* @param response response
* @param handler handler
* @param ex Exception
* @throws Exception Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
然后使用WebAppConfigurer进行拦截器注册,1.0的时候使用的是WebMvcConfigurer,但是2.0已经被告知属于过期的。所以使用替代他的WebMvcConfigurationSupport。
import com.shengxi.rs.common.filter.LoginStatusFilter;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @author matthew
*/
@Configuration
public class WebAppConfigurer extends WebMvcConfigurationSupport {
private List<String> excludePathPatternList;
/**
* 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
*
* @param registry 注册管理
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginStatusFilter()).addPathPatterns("/**").excludePathPatterns(getUrls());
super.addInterceptors(registry);
}
/**
* 这个方法是用来配置静态资源的,比如html,js,css,等等
*
* @param registry 注册管理
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
/**
* 定义需要避免过滤的url
*
* @return list
*/
private List<String> getUrls() {
List<String> list = new ArrayList<>();
list.add("/");
list.add("/login");
list.add("/index");
list.add("/static/**");
list.add("/static/user/css/*.css");
list.add("/static/user/js/*.js");
list.add("/static/user/images/*");
this.setExcludePathPatternList(list);
return excludePathPatternList;
}
public void setExcludePathPatternList(List<String> excludePathPatternList) {
this.excludePathPatternList = excludePathPatternList;
}
}
注意:一定要写对应的不拦截路径,否则会出现重定向次数过多的情况。因为程序会一直在login页面不断跳转。