现状做的一个练手项目,根据慕课网的仿大众点评源码自己修改的,使用session拦截器+auth拦截器。
之前用的Chrome浏览器,遇到的问题:登录后台,加载完菜单后,点进每一个子菜单都被踢回到login,打断点总是发现session被莫名其妙的清掉,期初以为是session拦截器出了问题,但源码基本没动呀,该不会有坑?
* session拦截器
public class SessionInterceptor implements HandlerInterceptor {
* 在进入Handler方法执行之前执行本方法
* @return true:执行下一个拦截器,直到所有拦截器都执行完,再执行被拦截的Controller
* false:从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//这里的用户信息在加载完菜单后就变成了null
System.out.println(request.getSession().getAttribute(SessionKeyConst.USER_INFO));
if (request.getSession().getAttribute(SessionKeyConst.USER_INFO) != null) {
return true;
// 针对ajax请求处理
if (request.getHeader("x-requested-with") != null) {
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
response.setHeader("url", basePath + "/login/sessionTimeout");
} else {
request.getRequestDispatcher("/login/sessionTimeout").forward(request, response);
return false;
后来观察AuthInterceptor的uri,发现下面代码的情况(/login/sessionTimeout和下面的/login/noAuth方法都是触发的session.invalidate())
public class AuthInterceptor implements HandlerInterceptor {
* 在进入Handler方法执行之前执行本方法
* @return true:执行下一个拦截器,直到所有拦截器都执行完,再执行被拦截的Controller
* false:从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//这里的request.getServletPath()出现了/favicon.ico的请求
if (CommonUtil.contains(request.getSession(), request.getServletPath(), request.getMethod())) {
return true;
// 针对ajax请求处理
if (request.getHeader("x-requested-with") != null) {
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
response.setHeader("url", basePath + "/login/noAuth");
} else {
request.getRequestDispatcher("/login/noAuth").forward(request, response);
return false;
这个/favicon.ico请求从哪来的?我搜了整个项目都没找到favicon.ico的字眼,我的项目里也没有favicon.ico这个文件,后来通过Google,发现浏览器自己会在页面加载完成后发起一个/favicon.ico的请求,这就有点蛋疼了,你请求都不告诉我一声,结果被我的auth拦截器拦下造成我session莫名其妙的被清空,害的我还找了半天原因。
解决办法:拦截器直接放行就ok啦~
<!-- 过滤浏览器发起的/favicon.ico请求,防止session被清空 -->
<mvc:exclude-mapping path="/favicon.ico"/>
再从需要的页面里引用上
<link rel="shortcut icon" href="/favicon.ico"/>
<link rel="bookmark" href="/favicon.ico"/>
现状做的一个练手项目,根据慕课网的仿大众点评源码自己修改的,使用session拦截器+auth拦截器。之前用的Chrome浏览器,遇到的问题:登录后台,加载完菜单后,点进每一个子菜单都被踢回到login,打断点总是发现session被莫名其妙的清掉,期初以为是session拦截器出了问题,但源码基本没动呀,该不会有坑?
springboot注册
拦截器后swagger冲突无法访问:
由于
拦截器会把所有
请求都
拦截下来,而swagger文档的页面资源和接口也会被
拦截,因此再注册
拦截器时需要将其排除.
springboot版本和swagger依赖:
<!--swagger-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
今天准备用node做个api出来,还没入门,遇到一个小问题,特在此记录一下!
在做路由模块的时候,发现控制台每次都会多输出一条favicon.ico的请求,对于这种又占资源,看着又碍眼的玩意,强迫症完全忍不了了,查了下代码,加了一行进去解决问题(没有技术含量,如果想笑话我的仁兄,请速速关闭浏览器)!
下面的代码是未更改前的路由,了解原理比什么都重要,对吧!
function rout...
var http = require('http');
http.createServer(function(req,res) {
console.log('hello world' + req.url);
if(req.url === "/favicon.ico") return;
//阻止响应
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Hello world\n');
}).listen(3000,'127.
Favicon是与您的网站相关的图标(favicon.ico)。 并非每个网站都在使用favicon。 但是大多数浏览器并不关心它,反正他们都要求它。 当图标图标不在适当位置时,服务器将返回不必要的404 Not Found错误。
在典型的Spring MVC应用程序中,我们首先需要配置安全过滤器,该过滤器允许所有对favicon.ico的请求,因为Spring Security会缓存用...
分享一个案例,作者分析和解决问题的思路流程很值得学习,所以记录mark下。
也许很难让人相信,一个favicon.ico图标会引起重大事故,而我真的就亲身经历了一回。最近上线的一个项目出现了匪夷所思的事情。如果不去抓包分析,就真的就可以称得上玄学了。
这个项目分为API后端和Android客户端以及嵌入WebView的网页。客户端除了登录和一些基本的API是原生操作以外,其他核心业务都是在We...
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("执行了preHandle方法");
return true;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("执行了postHandle方法");
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("执行了afterCompletion方法");
2. 在配置文件中配置
拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3. 在代码执行过程中,
拦截器的 `preHandle`、`postHandle` 和 `afterCompletion` 方法将会依次被调用。
希望这个示例代码能够帮助你实现自己的 Spring MVC
拦截器。