如何使用弹簧拦截器或过滤器拦截资源

时间:2017-04-06 06:12:38

标签: spring

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() {

}

}

1 个答案:

答案 0 :(得分:1)

拦截器是一种私有过滤器,由SpringMVC机器在控制器周围调用(甚至在渲染阶段之后)。因此,要求为一个未由DispatcherServlet处理的URL调用拦截器是没有意义的,DispatcherServlet是该机器的入口点。

这里必须使用普通的Java-EE Filter,因为servlet容器直接调用过滤器