我有一个带有Angular JS的Spring MVC Web应用程序,调用spring mvc控制器以检索和显示数据。我需要为我的应用程序实现身份验证过滤器,它将拦截每个请求以检查用户是否已登录。我正在使用sprint拦截器,通过扩展HandlerInterceptorAdapter创建一个类。
以下是我所做的配置 的web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Spring config xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="org.wepapp.interceptor.AuthInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
[编辑] 我的拦截器会被调用每个请求。在我的拦截器中,我检查用户会话是否对除登录之外的所有请求都有效。拦截器代码如下
@Component
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
public static Logger log = Logger.getLogger(AuthenticationInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) {
String uri = request.getRequestURI();
if (uri.endsWith("js") || uri.endsWith("css") || uri.contains("i18n") || uri.endsWith("png") || uri.endsWith("menu.htm") || uri.endsWith("header.jsp") || uri.endsWith("main.jsp")) {
return true;
}
if (!uri.contains("login")) {
User user = SessionHelper.getUser(request);
if (user == null) {
log.info("Session timed out, redirecting to login page");
try {
response.sendRedirect("/app/resources/main.jsp/#login");
response.flushBuffer();
return false;
} catch (IOException e) {
log.info("Error redirecting to login");
}
return false;
}
}
return true;
}
}
现在我遇到的问题是,如果我点击url说/app/resources/main.jsp/#user_details,控件转到拦截器,它在会话中找不到用户,但是没有得到重定向到登录页面。而是为同一个uri再次调用拦截器,并进入一个永无止境的循环。有没有办法让这个工作?