有时候项目里面会出现以下漏洞页面,我们可以使用拦截器去做一个简单的拦截避免这种情况发生
一、创建拦截器 实现HandlerInterceptor接口
我这边只拦截4xx和5xx的状态,你们自己随意修改postHandle里面的内容
package com.yami.shop.interceptor;
import com.alibaba.fastjson.JSONObject;
import com.yami.shop.common.exception.YamiShopBindException;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomHandlerInterceptor implements HandlerInterceptor {
/**
* 访问控制器方法前执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* 拦截4xx和5xx的状态 返回Json格式的 错误代码和信息 到页面
* 访问控制器方法后执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
if (!"".equals(response.getStatus()+"") && modelAndView != null) {
// 防止出现空指针
// 拦截4xx和5xx的状态
if(response.getStatus()>=400 && response.getStatus()<600) {
String jsonInfo = "{code:"+response.getStatus()+",msg:'访问页面错误'}";
// 返回Json格式的 错误代码和信息 到页面
// 我这边是自己项目的抛异常方法,你们可以自己发挥。
throw new YamiShopBindException(JSONObject.parseObject(jsonInfo).toJSONString());
// modelAndView.setViewName("/err"); 这个是跳转到/err的接口,我没有实现所以注释掉
}
}
}
/**
* postHandle方法执行完成后执行,一般用于释放资源
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
HandlerInterceptor
接口中定义以下 3 个方法:
二、配置拦截器
/**
* 拦截器装配
*/
@Configuration
public class OpenApiFilterConfig implements WebMvcConfigurer {
//找到你项目中实现WebMvcConfigurer 这个接口的配置类 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomHandlerInterceptor())
.addPathPatterns("/**");
}
}
addPathPatterns
:该方法用于指定拦截路径,例如拦截路径为"/**",表示拦截所有请求,包括对静态资源的请求。
excludePathPatterns
:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。(但是我尝试没有效果所以上面没用)用法:在后面再.excludePathPatterns("/", "/login", "/index")
。