过滤器
例子: 后台管理员登录过滤
设置过滤文件:
@WebFilter(filterName=“AdminLoginFilter”,value={"/manage/","/servlet/"})
@WebFilter(filterName="AdminLoginFilter",value={"/manage/*","/servlet/*"})
public class AdminLoginFilter{
public void destroy(){}
public void init(FilterConfig config)throws ServletException{}
public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) throws ServletException,IOException{
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
HttpSession session = request.getSession();
Admin admin =(Admin) session.getAttribute("admin");
if(admin==null)
{
String path = request.getRequestURI();
String queryString = request.getQueryString();
//请求的/servlet/AdminServlet?action=login 放行
if(path.contains("/servlet/AdminServlet"))&&"action=login".equals(queryString))
{
chain.doFilter(request,response);
}
else
{
response.sendRedirect(request.getContextPath()+"adminlogin.jsp") ;
}
}
else
{
chain.doFilter(req,resp);
}
}
}
过滤器的request触发方式
过滤器的触发方式:
默认为REQUEST,只有请求才会经过过滤器
注解的配置
@WebFilter(filterName="EncodingFilter",value="/*",dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD})
xml的配置
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.wanmait.qasys.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
多个过滤器组成过滤链:
如果一个请求经过多个过滤器,执行顺序同filter-mapping的配置顺序
如果使用注解的方式配置,执行顺序按照过滤器的名字filterName的字母顺序