配置类成功加载,但 addInterceptors 方法没有执行
我的 spring.xml 文件中包扫描配置包含如下:
<!--扫描基本包-->
<context:component-scan base-package="com.springSSM.ssm">
<!--context:exclude-filter标签:排除对某个注解的扫描(过滤controller层,因为已经在 springMVC 配置文件中扫描了)-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
上面的配置中已经扫描了 com.springSSM.ssm 下除 controller 外的所有子包其中也包括配置类,而且通过在配置类的构造方法中输出日志可以看到项目启动的时候构造函数确实被执行了。
配置类的完整代码如下:
package com.springSSM.ssm.config;
import com.springSSM.ssm.interceptor.JwtTokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
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 WebConfig implements WebMvcConfigurer {
//确实有输出,已经被扫描添加被实例化了
public WebConfig(){
System.out.println("---如果有输出,则说明被实例化,被扫描到");
}
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("只要执行就有输出");
//WebMvcConfigurer.super.addInterceptors(registry);
//registry.addInterceptor(jwtTokenUtil).addPathPatterns("/**").excludePathPatterns("/login");
registry.addInterceptor(jwtTokenUtil).addPathPatterns("/**");
}
}
从包扫描配置和 WebConfig 路径来看,它是可以被扫描的
但 addInterceptors 中的输出语句始终没有被执行,而且其中添加的拦截器也没有生效。
我的项目中已经有 servlet-context.xml 配置文件了,但是感觉拦截器用配置类配置会更方便一些,所以就出现了两个文件并存的局面,不知道 WebConfig 中的 addInterceptors 没有被执行是不是和这个有关系,servlet-context.xml 文件的全部内容如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启扫描器 ,spring的配置文件扫描时将 controller 排除掉了,这里添加上-->
<context:component-scan base-package="com.springSSM.ssm.controller"/>
<!--mvc 注解驱动并添加json 支持-->
<mvc:annotation-driven>
<mvc:message-converters>
<!--返回信息为字符串时 处理-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<!--将对象转换为json 对象-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!--使用默认的 Servlet 来响应静态文件-->
<mvc:default-servlet-handler/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<!--前缀:在WEB-INF目录下的jsp目录下-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀:以.jsp结尾的资源-->
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上传-->
<bean id="mutipartResollver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--允许文件上传的最大尺寸-->
<property name="maxUploadSize">
<value>10485700</value>
</property>
<!--设置文件放入临时文件夹的最大大小限制-->
<!--此值是阈值,低于此值,则保存在内存中,如高于此值,则生成硬盘上的的临时文件-->
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>
</beans>
从网上查找,说 SpringBoot会判断,如果有 WebMvcConfigurationSupport 就不会加载 WebMvcConfigurer 。但我的项目并没有用 springBoot,只是 SSM ,用了 springMVC,而且全局查找也没有搜到包含 WebMvcConfigurationSupport 的代码,接下来应该怎么排查?
回答:问题很明确哈,描述的也很清楚,问题已经找到了,第一个问题是 servlet-context.xml 配置文件中的扫描基本包写错了,写那个controller和config包的父目录即可,不然你的config包是不会被扫描到的;第二个问题也很明确了,你提出的问题可以采用RBAC模型来解决,它可以帮你很好的进行这样的接口鉴权;具体的你可以参考这篇文章:https://gitee.com/anxwefndu/rbac-model-simulation