@Slf4j
@SpringBootApplication
public class MvcTestApplication {
public static void main(String[] args) {
SpringApplication.run(MvcTestApplication.class, args);
}
@Slf4j
@RestController
public static class MyController {
@GetMapping("/test")
public String index1() {
log.info("访问 /test");
return "Hello MyController!";
}
@GetMapping("/public/test")
public String index2() {
log.info("访问 /public/test");
return "Hello Public!";
}
@PostMapping("/test2")
public String index3() {
log.info("访问 /test2 (POST)");
return "Hello POST!";
}
}
/**
* 登录拦截器:拦截需要登录的接口
*/
@Component
public static class LoginInterceptor implements HandlerInterceptor { // 改为 static
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws IOException {
String uri = request.getRequestURI();
log.info("LoginInterceptor 拦截请求: {}", uri);
// 只处理 Controller 请求
if (!(handler instanceof HandlerMethod)) {
return true;
}
// 模拟未登录
String authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
log.warn("未登录,拒绝访问: {}", uri);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("{\"code\":401, \"msg\":\"请先登录\"}");
return false;
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("LoginInterceptor 拦截请求完成: {}", response.getStatus());
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
@Component
public static class LoginInterceptor2 implements HandlerInterceptor { // 改为 static
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws IOException {
String uri = request.getRequestURI();
log.info("LoginInterceptor2 拦截请求: {}", uri);
// 只处理 Controller 请求
if (!(handler instanceof HandlerMethod)) {
return true;
}
// 模拟未登录
String authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
log.warn("未登录,拒绝访问: {}", uri);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("{\"code\":401, \"msg\":\"请先登录\"}");
return false;
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("LoginInterceptor2 拦截请求完成: {}", response.getStatus());
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
@Configuration
public static class WebConfig implements WebMvcConfigurer { // 改为 static
@Autowired
private LoginInterceptor loginInterceptor;
@Autowired
private LoginInterceptor2 loginInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截所有,但排除 /public/**
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/public/**");
registry.addInterceptor(loginInterceptor2)
.addPathPatterns("/**")
.excludePathPatterns("/public/**");
}
}
/**
* 自定义 Filter 1:记录所有请求(包括静态资源)
*/
@Component
@Order(1) // 优先级高(数字小)
public static class MyCustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
log.info(">>> MyCustomFilter 开始: {}", req.getRequestURI());
String token = req.getHeader("Authorization");
if (token != null){
// 进入程序
chain.doFilter(request, response);
}
else{
// 模拟未登录
log.warn("未登录,拒绝访问: {}", req.getRequestURI());
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
httpResponse.setContentType("application/json;charset=utf-8");
httpResponse.getWriter().write("{\"code\":401, \"msg\":\"请先登录\"}");
}
log.info("<<< MyCustomFilter 结束: {}", req.getRequestURI());
}
}
/**
* 自定义 Filter 2
*/
@Component
@Order(2)
public static class MyCustomFilter2 implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
log.info(">>> MyCustomFilter2 开始: {}", req.getRequestURI());
chain.doFilter(request, response);
log.info("<<< MyCustomFilter2 结束: {}", req.getRequestURI());
}
}
}