拦截器实现身份认证,资源配置

一、添加拦截器

public class PermissionInterceptor extends HandlerInterceptorAdapter {
    @Override
    //在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制等处理;
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        
        //验证权限
        checkPermission(handler);

        return true;
    }

    @Override
    //在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView;
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

    }

    @Override
    //在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面),可以根据ex是否为null判断是否发生了异常,进行日志记录;
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {

    }

    @Override
    public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }

    /**
     * 是否有权限
     *
     * @param handler
     * @return
     */
    private void checkPermission(Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            // 获取方法上的注解
            //allowAnonymous不加任何验证
            AllowAnonymous allowAnonymous = handlerMethod.getMethod().getAnnotation(AllowAnonymous.class);
            if (allowAnonymous != null)
                return;
            RequiredPermission requiredPermission = handlerMethod.getMethod().getAnnotation(RequiredPermission.class);
            // 如果方法上的注解为空 则获取类的注解
            if (requiredPermission == null) {
                requiredPermission = handlerMethod.getMethod().getDeclaringClass().getAnnotation(RequiredPermission.class);
            }
            // 如果标记了注解,则判断权限
            if (requiredPermission != null) {
                //TODO
            }
        }
    }
}

一、添加拦截器

/**
 * web 配置文件
 */
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    /**
     * 跨域支持
     */
    @Bean
    public FilterRegistrationBean corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4
        FilterRegistrationBean bean = new FilterRegistrationBean<>(new CorsFilter(source));
        // 这个顺序很重要哦,为避免麻烦请设置在最前
        bean.setOrder(0);
        return bean;
    }

    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
        corsConfiguration.addAllowedHeader("*"); // 2允许任何头
        corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
        return corsConfiguration;
    }

    /**
     * 添加静态资源--过滤swagger-api (开源的在线API文档)
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        过滤swagger,addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
//        第一个方法设置访问路径前缀,第二个方法设置资源路径
        registry.addResourceHandler("/**").addResourceLocations("classpath:/public/");
        //要加file
        //registry.addResourceHandler("/img/**").addResourceLocations("file:E:/GitRepository/ikang-tech/tech-service/imgs/");
        registry.addResourceHandler("/img/**").addResourceLocations("file:"+projectPath.getImgPath());
    }

    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return factory -> {
            ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
            factory.addErrorPages(error404Page);
        };
    }
    @Bean
    public PermissionInterceptor getLoginInterceptor(){
        return new PermissionInterceptor(authService);
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getLoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/error")
                .excludePathPatterns("/static/*")
                .excludePathPatterns("/auth/*")
                .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Flume最重要的组件是Source、Channel和Sink,另外,Flume Agent还有一些使Flume更...
    叫我不矜持阅读 2,699评论 0 3
  • 拦截器是Struts2框架的核心,它主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传...
    重山杨阅读 4,005评论 2 13
  • 今天我们接着来拆下ARouter的拦截器,这个是ARouter路由框架的第六篇分享了。在Android系统自带的s...
    juexingzhe阅读 17,971评论 2 19
  • Struts2的核心在于它复杂的拦截器,几乎70%的工作都是由拦截器完成的。比如我们之前用于将上传的文件对应于ac...
    Single_YAM阅读 582评论 0 6
  •   通过前面的学习,我们了解到Action才是具体处理用户的业务实现部分,但有的时候我们需要在Action处理业务...
    肖sir_嘉立老师阅读 843评论 0 7