Java如何使用@WebFilter注解定义过滤器?

以下示例显示了如何使用@WebFilter注解创建servlet过滤器。我们将创建一个简单的过滤器,该过滤器将检查http会话对象中是否存在属性。如果未找到任何属性,则此过滤器会将用户重定向到登录页面。

package org.nhooo.example.filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = {"/*"}, description = "Session Checker Filter")
public class SessionCheckerFilter implements Filter {
    private FilterConfig config = null;

    public void init(FilterConfig config) throws ServletException {
        this.config = config;
        config.getServletContext().log("Initializing SessionCheckerFilter");
    }

    public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain)
            throws ServletException, IOException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        //
        // 检查用户的会话属性是否包含一个属性
        //命名为AUTHENTICATED。如果该属性不存在,则重定向
        // 用户登录页面。
        //
        if (!request.getRequestURI().endsWith("login.jsp") &&
                request.getSession().getAttribute("AUTHENTICATED") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        }
        chain.doFilter(req, res);
    }

    public void destroy() {
        config.getServletContext().log("Destroying SessionCheckerFilter");
    }
}

在Servlet 3.0规范中定义的@WebFilter注解诞生之前。为了使过滤器起作用,我们必须在web.xml中使用filter和filter-mapping元素将其注册到文件中。并且一旦激活,它将与当前Servlet上下文的过滤器链中的其他过滤器协作。