Springboot(一)项目中遇到的问题

问题一

在入口Application类上使用了注解@ComponentScan,拦截类只加@WebFilter注解,拦截器不起作用。

1、 明明在@WebFilter(urlPatterns={"/*"})中过滤的是/assess/ 路径,但是运行之后发现,所有的请求都没有被拦截。

2、 运行之后发现过滤器没有初始化,没有被加载。

解决方法:

  1. 在拦截器方法类上面加上注解 @Component或@Configuration 即可。(我觉得是因为过滤器没有被注册到Spring 容器中,所以过滤器没有被初始化,加载不出来)
  2. 把@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");
			}

总结

虽然最终的解决方法不怎么满意,但好歹还是实现了 单点登录跟后台登录两种登录方式,也算是达到了自己的目的,可喜可贺吧。时间仓促没有细致研究更深层次的东西。但还是记录一下,免的忘记。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值