过滤器。Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器(Filter)。通过Filter,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.
比如:在用户张三登录后,会跳转到张三的个人主页,正常来说,当张三注销登录时,想要再次直接使用这个页面的URL直接请求张三的个人主页是不被允许的。Filter就可以起到拦截此时的URL。
即在调用目标资源之前先运行Filter做判断。
Filter接口的三个方法
public void init(FilterConfig filterConfig);//初始化Filter。服务器一运行就执行
//参数的方法
public interface FilterConfig {
String getFilterName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration getInitParameterNames();
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
//ServletRequest,ServletResponse就是ServletResponse请求与响应。注意不是HttpServletRequest,HttpServletResponse。
public interface HttpServletRequest extends ServletRequest {}
//使用强转
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse) servletResponse;
/*FilterChain可以进行doFilter的循环调用。这可以保证每次资源调用之前doFilter的运行。web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问否则web资源不会被访问。*/
public interface FilterChain {
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
//服务器关闭,Filter销毁。可以释放过滤器使用的资源。
public void destroy() {
}
Filter 的使用
创建 Filter实现类,重写上面三个方法。
public class SysFilter implements Filter {
//服务器建立,Filter就建立
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse) servletResponse;
if(req.getSession().getAttribute("USER_SESSION")==null){
resp.sendRedirect("/error/404.jsp");
}else{
}
filterChain.doFilter(servletRequest, servletResponse);
}
//服务器关闭,Filter销毁
@Override
public void destroy() {
}
}
在web.xml文件中配置注册与映射。
<filter>
<!--自定义Filter实现类name-->
<filter-name>SysFilter</filter-name>
<!--Filter实现类的路径-->
<filter-class>com.mcwen.filter.SysFilter</filter-class>
</filter>
<!--Filter路径映射-->
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/sys/*</url-pattern>
</filter-mapping>
原文:https://www.cnblogs.com/mincw/p/15249564.html