项目配置
一、登录拦截使用过滤器
@WebFilter(filterName = "loginFilter",urlPatterns = "/*")
@Slf4j
public class LoginFilter implements Filter {
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//先获取到访问路径
String requestURI = request.getRequestURI();
//判断该路径是否需要进行拦截
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
boolean matchTemp = checkUrl(urls, requestURI);
if(matchTemp){
//不需要进行判断
log.info("本次请求不需要处理");
filterChain.doFilter(request,response);
return;
}
if(ObjectUtil.isNotEmpty(request.getSession().getAttribute("employee"))){
log.info("已经登录,登录人:{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);
return;
}
log.info("用户未登录");
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
//需要拦截,判断当前登录用户是否登录
//没有登录跳转到登录页面
//登录之后放行
}
private boolean checkUrl(String[] urls,String requestURI){
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, requestURI);
if(match){
return true;
}
}
return false;
}
}
实现Filter接口,重写doFilter方法,进行判断放行
路径匹配使用
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
这个类中有个match方法
boolean match = PATH_MATCHER.match(url, requestURI);
注意:
加上注解@WebFilter,说明该类为过滤器
同时需要在ReggieTakeOutApplication启动类上加注解@ServletComponentScan,直接将filter过滤器注入到Spring容器中
在SpringBootApplication上使用@ServletComponentScan注解后,
Servlet(控制器)、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册到Spring容器中,无需其他代码。
二、全局异常处理类
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@RestController //将结果封装为json格式
@Slf4j
public class GlobalExceptionHandler {
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
log.error(ex.getMessage());
if(ex.getMessage().contains("Duplicate entry")){
String[] s = ex.getMessage().split(" ");
return R.error(s[2] + "重复了");
}
return R.error("未知错误");
}
}
1.通过@controllerAdvice 注解,我们可以在一个地方对所有@controller注解的控制器进行管理
注解了@ControllerAdvice 的类的方法可以使用 @ExceptionHandler、@InitBinder、@ModelAttribute 注解到方法上,这对所有注解了@RequestMapping的控制器内的方法都有效
2.@ExceptionHandler:用于捕获所有控制器里面的异常,并进行处理
三、Mybatis Plus分页插件的配置
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
四、WebMvcConfigurationSupport类
1.WebMvcConfigurationSupport类是SpringMVC提供的扩展类,用于提供拦截器、资源处理器等注册功能
2.代码展示
@Slf4j
@Configuration //说明是配置类
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* 设置静态资源映射
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry){
log.info("进行静态资源映射。。。。");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
}
@Override
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters){
log.info("扩展消息转换器");
//创建消息转换器
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//设置对象转换器,底层使用Jackson将Java转换成json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//将上面的消息转换器对象追加到mvc框架的转换器集合中
converters.add(0,messageConverter);
}
}