applicationContext.xml中的我的配置如下:
<mvc:annotation-driven/>
<context:component-scan base-package="com.lixindi.gradproject"/>
<mvc:resources mapping="login/**" location="login/"/>
<mvc:resources mapping="admin/**" location="admin/"/>
<mvc:resources mapping="vote/**" location="vote/"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/**"/>
<bean class="com.lixindi.gradproject.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
LoginInterceptor:
public class LoginInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
if (httpServletRequest.getSession().getAttribute("user") == null) {
httpServletResponse.sendRedirect("/login/login.html");
System.out.println("invoked");
return false;
} else {
return true;
}
}
}
webapp / admin下有几个html文件,我不想通过DispatcherServlet。并且拦截器不拦截请求,例如http://localhost:8080/admin/admin.html。但是我想要拦截包括资源在内的任何网址,以确保用户已登录。我怎么能让这个工作?
感谢@Serge Ballesta。
但是,它仍然无法拦截资源,例如http://localhost:8080/admin/admin.html。
的web.xml:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.lixindi.gradproject.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
LoginFilter:
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
System.out.println("filter");
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect("/login/login.html");
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
public void destroy() {
}
}
答案 0 :(得分:1)
拦截器是一种私有过滤器,由SpringMVC机器在控制器周围调用(甚至在渲染阶段之后)。因此,要求为一个未由DispatcherServlet处理的URL调用拦截器是没有意义的,DispatcherServlet是该机器的入口点。
这里必须使用普通的Java-EE Filter
,因为servlet容器直接调用过滤器