搜索 K
Appearance
博客正在加载中...
Appearance
之前我们说了 SpringBoot 处理请求的底层原理,接下来就来说说其他常用的 web 功能,例如拦截器、文件上传、异常处理等。
还是以我们的后台管理系统为例,我们只有在 main 页面做了登录的校验,其他都是没做校验的;
但如果每个页面请求都做登录校验,就太麻烦了,有很多的重复代码;为此我们可以使用拦截器(原生 Servlet 的 Filter 也可以)
在底层中,拦截器是这样一个接口:
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
} 说明:
我们可以通过实现拦截器接口,来完成拦截,例如:
package com.peterjxl.learnspringbootwebadmin.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 登录检查
* 1. 配置好拦截器要拦截哪些请求
* 2. 把这些配置放在容器中
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if (loginUser != null) {
// 已登录
return true;
}
// 未登录,返回登录页面
request.setAttribute("msg", "请先登录");
request.getRequestDispatcher("/").forward(request, response);
return false;
}
}
新增了拦截器后,我们还得将其放到容器中:
package com.peterjxl.learnspringbootwebadmin.config;
import com.peterjxl.learnspringbootwebadmin.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 拦截所有请求,包括静态资源
.excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**", "/js/**");
}
} 注意,我们还配置了拦截规则和放行规则。然后我们就可以去除 main 页面中的校验登录的代码了。
我们直接访问 localhost: 9999/dynamic_table,此时就访问不了,而提示要登录:
总结下拦截器的使用步骤: