一个过滤器如何过滤多个资源
- 将要过滤的多个资源放在同一个路径下。如果是静态资源,可以将这些静态资源放在同一个文件夹下;如果是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>
- 将要过滤的资源放在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(",");
}
}
}