作者:呆子只爱小呆 | 来源:互联网 | 2023-07-07 18:05
1.简介
preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用。
SpringMVC中的Interceptor拦截器是链式的,可以同时存在多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller方法调用之前调用。
(SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。)
重写preHandle方法,在请求发生前执行。
 
2.问题
我们先来看看尼特社区的原始代码:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//设置广告
for (AdPosEnum adPos : AdPosEnum.values()) {
request.getServletContext().setAttribute(adPos.name(), adService.list(adPos.name()));
}
COOKIE[] COOKIEs = request.getCOOKIEs();
if(COOKIEs!=null&&COOKIEs.length!=0){
for (COOKIE COOKIE : COOKIEs) {
if(COOKIE.getName().equals("token")){
String token=COOKIE.getValue();
UserExample userExample = new UserExample();
userExample.createCriteria()
.andTokenEqualTo(token);
List users = userMapper.selectByExample(userExample);
if(users.size()!=0){
User user = users.get(0);
UserAccountExample userAccountExample = new UserAccountExample();
userAccountExample.createCriteria().andUserIdEqualTo(user.getId());
List userAccounts = userAccountMapper.selectByExample(userAccountExample);
UserAccount userAccount = userAccounts.get(0);
request.getSession().setAttribute("user",user);
request.getSession().setAttribute("userAccount",userAccount);
Long unreadCount = notificationService.unreadCount(users.get(0).getId());
request.getSession().setAttribute("unreadCount", unreadCount);
System.out.println("用户组ID:"+userAccount.getGroupId());
}
break;
}
}
}
return true;
}
我们在调试中,打印登录用户的用户组ID,发现用户每次访问一个页面,preHandle()方法都会执行24次之多。在大访问量下,这对服务器和数据库都会造成极大的压力,从而影响到性能。
![【JAVA笔记】记一次HandlerInterceptor处理器拦截优化,解决preHandle()执行多次的问题 - 文章图片](https://img7.php1.cn/3cdc5/ca9e/525/4b51a6dd6df07349.jpeg)
 
3.解决方法
我们发现拦截器会对页面用到的外部CSS,js,图片文件等静态资源也会进行拦截,所以我们只需要过滤掉队静态资源的拦截即可。我们在preHandle()方法的最前部加入以下一行代码:
if (handler instanceof ResourceHttpRequestHandler)
return true;
再调试一次,发现只打印一次了。问题解决!
![【JAVA笔记】记一次HandlerInterceptor处理器拦截优化,解决preHandle()执行多次的问题 - 文章图片](https://img7.php1.cn/3cdc5/ca9e/525/54f0f65892591d77.jpeg)
原文地址:https://niter.cn/p/100
 
欢迎访问我的开源社区:https://niter.cn/
kuaileky
发布了16 篇原创文章 · 获赞 1 · 访问量 6533
私信
关注