过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,INCLUDE或FORWARD或REQUEST或ERROR该元素位于filter-mapping中。
一、批量设置请求编码
- public
class EncodingFilter implements Filter { -
-
private String encoding = null; -
-
public void destroy() { -
encoding = null; -
} -
-
public void doFilter(ServletRequest request, ServletResponse response, -
FilterChain chain) throws IOException, ServletException { -
String encoding = getEncoding(); -
if (encoding == null){ -
encoding = "gb2312"; -
} -
request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码 -
chain.doFilter(request, response); -
} -
-
public void init(FilterConfig filterConfig) throws ServletException { -
this.encoding = filterConfig.getInitParameter("encoding"); -
} -
-
private String getEncoding() { -
return this.encoding; -
} -
- }
- public
class EncodingFilter implements Filter { -
-
private String encoding = null; -
-
public void destroy() { -
encoding = null; -
} -
-
public void doFilter(ServletRequest request, ServletResponse response, -
FilterChain chain) throws IOException, ServletException { -
String encoding = getEncoding(); -
if (encoding == null){ -
encoding = "gb2312"; -
} -
request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码 -
chain.doFilter(request, response); -
} -
-
public void init(FilterConfig filterConfig) throws ServletException { -
this.encoding = filterConfig.getInitParameter("encoding"); -
} -
-
private String getEncoding() { -
return this.encoding; -
} -
- }
- <</span>filter>
-
<</span>filter-name>EncodingFilter</</span>filter-name> -
<</span>filter-class>com.logcd.filter.EncodingFilter</</span>filter-class> -
<</span>init-param> -
<</span>param-name>encoding</</span>param-name> -
<</span>param-value>gb2312</</span>param-value> -
</</span>init-param> - </</span>filter>
-
- <</span>filter-mapping>
-
<</span>filter-name>EncodingFilter</</span>filter-name> -
<</span>url-pattern>/*</</span>url-pattern> - </</span>filter-mapping>
- <</span>filter>
-
<</span>filter-name>EncodingFilter</</span>filter-name> -
<</span>filter-class>com.logcd.filter.EncodingFilter</</span>filter-class> -
<</span>init-param> -
<</span>param-name>encoding</</span>param-name> -
<</span>param-value>gb2312</</span>param-value> -
</</span>init-param> - </</span>filter>
-
- <</span>filter-mapping>
-
<</span>filter-name>EncodingFilter</</span>filter-name> -
<</span>url-pattern>/*</</span>url-pattern> - </</span>filter-mapping>
二、用filter控制用户访问权限
- public
void doFilter(ServletRequest request, -
ServletResponse response, -
FilterChain chain) -
throws IOException, ServletException { -
-
HttpServletRequest req = (HttpServletRequest) request; -
HttpServletResponse res = (HttpServletResponse) response; -
-
HttpSession session = req.getSession(); -
if (session.getAttribute("username") != null) {//登录后才能访问 -
chain.doFilter(request, response); -
} else { -
res.sendRedirect("../failure.jsp"); -
} - }
- public
void doFilter(ServletRequest request, -
ServletResponse response, -
FilterChain chain) -
throws IOException, ServletException { -
-
HttpServletRequest req = (HttpServletRequest) request; -
HttpServletResponse res = (HttpServletResponse) response; -
-
HttpSession session = req.getSession(); -
if (session.getAttribute("username") != null) {//登录后才能访问 -
chain.doFilter(request, response); -
} else { -
res.sendRedirect("../failure.jsp"); -
} - }
- <</span>filter>
-
<</span>filter-name>SecurityFilter</</span>filter-name> -
<</span>filter-class>com.logcd.filter.SecurityFilter</</span>filter-class> - </</span>filter>
- <</span>filter-mapping>
-
<</span>filter-name>SecurityFilter</</span>filter-name> -
<</span>url-pattern>/admin/*</</span>url-pattern> - </</span>filter-mapping>
- <</span>filter>
-
<</span>filter-name>SecurityFilter</</span>filter-name> -
<</span>filter-class>com.logcd.filter.SecurityFilter</</span>filter-class> - </</span>filter>
- <</span>filter-mapping>
-
<</span>filter-name>SecurityFilter</</span>filter-name> -
<</span>url-pattern>/admin/*</</span>url-pattern> - </</span>filter-mapping>
三、过滤链
执行的代码顺序是:
- 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
- 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
- 如果用户已登录,则访问请求的资源:/admin/index.jsp。
- 如果用户未登录,则页面重定向到:/failure.jsp。
- 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
- 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。