2. 过滤器

一个过滤器如何过滤多个资源

  1. 将要过滤的多个资源放在同一个路径下。如果是静态资源,可以将这些静态资源放在同一个文件夹下;如果是servlet或action,将他们的访问路径加上前缀,例如将登陆和注册的servlet配置为@WebServlet("/user/loginServlet")和@WebServlet("/user/registerServlet")。

2.在web.xml中配置过滤器时,一个filter对应多个filter-mapping,不建议一个filter-mapping里边写多个url-pattern。

<filter>
	<filter-name>login</filter>
	<filter-class>com.xxx.xxx.XXXFilter</filter-class>
<filter>
<filter-mapping>
	<filter-name>login</filter>
	<url-mapping>/order/*</url-mapping>
</filter-mapping>
<filter-mapping>
	<filter-name>login</filter>
	<url-mapping>/cart/*</url-mapping>
</filter-mapping>

 

  1. 将要过滤的资源放在filter的初始化参数,在filter初始化时读取到这些参数,在dofilter中获取请求的url,判断如果url包含这些资源就执行过滤,如果不包含就放行。
<filter>
	<filter-name>LoginFilter</filter-name>
  	<filter-class>com.xxx.filter.LoginFilter</filter-class>
	  <init-param>
	    <param-name>ignores</param-name>
	    <!-- 将要过滤的资源放在这里 -->
	    <param-value>/cart/,/order/,/address/,/addr/</param-value>
	  </init-param>
</filter>
<filter-mapping>
  <filter-name>LoginFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

 

public class LoginFilter implements Filter {
     /**
     * 将要过滤的资源放在init-param中
     * 在web.xml中配置filter的init-param
     */
    private String includedPaths;
    private String [] includedPathArray;


    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        boolean flag = false;       // 判断是否要过滤

        String uri = request.getRequestURI();

        for (String path : includedPathArray)
            if (uri.contains(path)) {
                flag = true;
                break;
            }

        if (flag) {
            User user = (User) request.getSession().getAttribute("user");
            if(user == null) {
                response.sendRedirect(request.getContextPath() + "/user/login_form.jsp");
            } else {
                chain.doFilter(req,resp);
            }
        } else {
            chain.doFilter(req,resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {
        // 初始化时读取web.xml中配置的init-param
        includedPaths = config.getInitParameter("include");
        if(StringUtils.isNotBlank(includedPaths) && StringUtils.isNotEmpty(includedPaths)) {
            includedPathArray = includedPaths.split(",");
        }
    }

}