关于自定义拦截器与annotation-driven冲突的问题解决
今天在想做一个spring的拦截器,却一直没有起作用,在网上看了一下,原来是说因为annotation-driven会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 导致interceptor失效。
网上的方法大多是要二者取其一,可我不能把注解驱动删了,就偶尔试到了一个解决办法。
这里写了一个自定义的拦截器,这个@Component的注解就是问题解决的关键
package com.hsd.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component <!--帮助扫描到这拦截器文件
public class LoginInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
HttpSession session = request.getSession();
Object userId = session.getAttribute("userId");
Object userName = session.getAttribute("userName");
if(userId == null || userName == null){
System.out.println("当前用户没有登录");
response.sendRedirect(request.getContextPath()+"/login/index");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
下面是拦截器的配置文件,把拦截器紧挨着扫描注解写吧,我之前放在文件最底部就没有用。
<mvc:annotation-driven enable-matrix-variables="true"> </mvc:annotation-driven>
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.hsd.controller"></context:component-scan>
<!-- 自定义拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/login/*" />
<mvc:exclude-mapping path="/login/index" />
<bean class="com.hsd.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
没怎么做过项目,下午把一些网上的看到的方法试了一下没有效果,就自己胡乱试了很多,不是很懂为什么可以运行了,个人理解应该是annotation-driven扫描注解的时候,把拦截器也给扫描了,总之拦截未登录的用户的目的达到了。