Springboot(一)项目中遇到的问题
程序员文章站
2022-05-30 17:41:59
...
问题一
在入口Application类上使用了注解@ComponentScan,拦截类只加@WebFilter注解,拦截器不起作用。
1、 明明在@WebFilter(urlPatterns={"/*"})中过滤的是/assess/ 路径,但是运行之后发现,所有的请求都没有被拦截。
2、 运行之后发现过滤器没有初始化,没有被加载。
解决方法:
- 在拦截器方法类上面加上注解 @Component或@Configuration 即可。(我觉得是因为过滤器没有被注册到Spring 容器中,所以过滤器没有被初始化,加载不出来)
- 把@ComponentScan注解换成@ServletComponentScan,过滤器成功加载,请求也成功拦截。(但是这样又有其他问题出现,因为我的入口Application类跟业务代码等包是平级关系,项目启动的时候,业务代码并不能被识别并加载,时间太短并不能研究这个原理,暂且用第一种方法解决。)
PS:找到一个说的很清楚明白的文章:Springboot注解@ServletComponentScan和@ComponentScan
问题二
遇到第一个问题,用了第一种解决方式,又迎来了下一个问题,可见这些方法并不能根本解决问题 ( ̄▽ ̄)" ,因为加了@compent或者@configruation注解的原因,拦截器把所有请求都给拦截了
如果添加了@Component或@Configuration,又添加了@WebFilter(),那么会初始化两次Filter,并且会过滤所有路径+自己指定的路径 ,便会出现对没有指定的URL也会进行过滤
本来想研究一下@ComponentScan注解换成@ServletComponentScan,然后把 启动类放到 业务代码最外层 的包下面,这样既能自动加载,也不会初始化两遍拦截器 。
奈何项目架构不是我做,项目也不是我一个人的项目,这样子做不行。
于是只能另寻他法了。
解决方法:
最终只能拦截所有请求,然后获取进来的 request 路径,进行判断,然后放行。所幸路径不是很多,最终成功达到目的。
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
HttpSession session = request.getSession();
String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", "");
if(path.equals("/login/login.htm") || path.equals("/login.html")){
arg2.doFilter(request, response);
}else{
// 需要重新登录
response.sendRedirect("/sso.htm");
}
总结
虽然最终的解决方法不怎么满意,但好歹还是实现了 单点登录跟后台登录两种登录方式,也算是达到了自己的目的,可喜可贺吧。时间仓促没有细致研究更深层次的东西。但还是记录一下,免的忘记。