Untuk keperluan ini, perkara pertama yang terlintas di fikiran sudah tentu antara muka AOP yang disediakan oleh Spring-boot Anda hanya perlu menambah titik sebelum kaedah Pengawal, dan kemudian memprosesnya potong mata.
dan langkah penggunaannya adalah seperti berikut:
Gunakan @Aspect untuk mengisytiharkan kelas aspek WhitelistAspect
Gunakan anotasi AOP spring @Sebelum dalam kelas aspek untuk mengisytiharkan kaedah pemberitahuan checkWhitelist() untuk mengesahkan senarai putih sebelum kaedah Pengawal dilaksanakan.
Pseudokod kelas aspek adalah seperti berikut:
@Aspect public class WhitelistAspect { @Before(value = "whitelistPointcut() && @annotation(whitelist)") public void checkAppkeyWhitelist(JoinPoint joinPoint, Whitelist whitelist) { checkWhitelist(); // 可使用 joinPoint.getArgs() 获取Controller方法的参数 // 可以使用 whitelist 变量获取注解参数 } @Pointcut("@annotation(com.zhenbianshu.Whitelist)") public void whitelistPointCut() { } }
Sambungan
Pemintas Spring juga sangat sesuai untuk melaksanakan fungsi ini. Seperti namanya, pemintas digunakan untuk menentukan sama ada untuk melaksanakan kaedah ini melalui beberapa parameter sebelum Tindakan dalam Pengawal dilaksanakan Untuk melaksanakan pemintas, anda boleh melaksanakan antara muka HandlerInterceptor Spring.
Tentukan kelas pemintas AppkeyInterceptor dan laksanakan antara muka HandlerInterceptor.
melaksanakan kaedah preHandle()nya;
menentukan sama ada permintaan perlu dipintas melalui anotasi dan parameter dalam kaedah praHandle permintaan, antara muka mengembalikan palsu;
Daftarkan pemintas ini dalam kelas WebMvcConfigurerAdapter tersuai; >
@Component public class WhitelistInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Whitelist whitelist = ((HandlerMethod) handler).getMethodAnnotation(Whitelist.class); // whitelist.values(); 通过 request 获取请求参数,通过 whitelist 变量获取注解参数 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 方法在Controller方法执行结束后执行 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在view视图渲染完成后执行 } }
@Configuration public class MvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new WhitelistInterceptor()).addPathPatterns("/*").order(1); // 这里可以配置拦截器启用的 path 的顺序,在有多个拦截器存在时,任一拦截器返回 false 都会使后续的请求方法不再执行 } }
Juga ambil perhatian bahawa selepas pemintas berjaya dilaksanakan, kod respons ialah 200, tetapi data respons kosong.
Selepas menggunakan pemintas untuk melaksanakan fungsi, ketua akhirnya menghasilkan helah besar: kita sudah mempunyai parameter Auth, kunci apl boleh diperolehi daripada parameter Auth, dan kehadiran atau ketiadaan senarai putih boleh digunakan sebagai kaedah Auth. Mengapa tidak mengesahkan semasa Auth? emmm... Muntah darah.
Penghurai parameter ialah alat yang disediakan oleh Spring untuk menghuraikan parameter tersuai kami yang biasa digunakan menggunakan bayangannya, kita boleh Parameter digabungkan menjadi apa yang kita mahukan sebelum memasuki Tindakan Pengawal. Spring akan mengekalkan ResolverList Apabila permintaan tiba, Spring mendapati bahawa terdapat parameter jenis tersuai (jenis bukan asas), dan akan mencuba Penyelesai ini dalam urutan sehingga Penyelesai boleh menghuraikan parameter yang diperlukan. Untuk melaksanakan penyelesai parameter, anda perlu melaksanakan antara muka HandlerMethodArgumentResolver.
Pelaksanaan
@Component public class AuthParamResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(AuthParam.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { Whitelist whitelist = parameter.getMethodAnnotation(Whitelist.class); // 通过 webRequest 和 whitelist 校验白名单 return new AuthParam(); } }
@Configuration public class MvcConfiguration extends WebMvcConfigurerAdapter { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(new AuthParamResolver()); } }
Kali ini pelaksanaan selesai, saya masih agak bimbang, jadi saya mencari dalam talian untuk melihat sama ada terdapat cara lain untuk mencapai fungsi ini, dan mendapati bahawa Penapis adalah yang biasa.
Filter 并不是 Spring 提供的,它是在 Servlet 规范中定义的,是 Servlet 容器支持的。被 Filter 过滤的请求,不会派发到 Spring 容器中。它的实现也比较简单,实现 javax.servlet.Filter接口即可。
由于不在 Spring 容器中,Filter 获取不到 Spring 容器的资源,只能使用原生 Java 的 ServletRequest 和 ServletResponse 来获取请求参数。
另外,在一个 Filter 中要显示调用 FilterChain 的 doFilter 方法,不然认为请求被拦截。实现类似:
public class WhitelistFilter implements javax.servlet.Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化后被调用一次 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 判断是否需要拦截 chain.doFilter(request, response); // 请求通过要显示调用 } @Override public void destroy() { // 被销毁时调用一次 } }
Filter 也需要显示配置:
@Configuration public class FilterConfiguration { @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new WhitelistFilter()); registration.addUrlPatterns("/*"); registration.setName("whitelistFilter"); registration.setOrder(1); // 设置过滤器被调用的顺序 return registration; } }
Atas ialah kandungan terperinci Cara Springboot melaksanakan pengesahan Pengesahan universal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!