web.xml文件中filter配置详解

从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持,过滤器能够对目标资源的请求和相应进行截取。过滤器的工作方式分为4种:request过滤器,include过滤器,forward过滤器,error过滤器。

过滤器的工作分为等我弄懂了再说。我们先说说Java如何处理filter请求

public class AuthorityFilter implements Filter 
{
//FilterConfig可用于访问Filter的配置信息
private FilterConfig config;
//实现初始化方法
public void init(FilterConfig config)
{
this.config = config; 
}
//实现销毁方法
public void destroy()
{
this.config = null; 
}
//执行过滤的核心方法
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException,ServletException
{
//获取该Filter的配置参数
String encoding = config.getInitParameter("encoding");
String loginPage = config.getInitParameter("loginPage");
String proLogin = config.getInitParameter("proLogin");
//设置request编码用的字符集
request.setCharacterEncoding(encoding);                    //①
HttpServletRequest requ = (HttpServletRequest)request;
HttpSession session = requ.getSession(true);
//获取客户请求的页面
String requestPath = requ.getServletPath();
//如果session范围的user为null,即表明没有登录
//且用户请求的既不是登录页面,也不是处理登录的页面
if( session.getAttribute("user") == null
&& !requestPath.endsWith(loginPage)
&& !requestPath.endsWith(proLogin))
{
//forward到登录页面
request.setAttribute("tip" , "您还没有登录");
request.getRequestDispatcher(loginPage)
.forward(request, response);
}
//“放行”请求
else
{
chain.doFilter(request, response);
}
}
}

上面Filter的doFilter方法里前三行代码用于获取Filter的配置参数。①号代码按配置参数设置了request编码所用的字符集。接下来判断session范围内是否有user属性,没有该属性即认为没有登录,如果既没有登录,而且请求地址也不是登录页面和处理登录页面,那么系统直接跳转到登录页面。

该Filter在web.xml中的配置片段如下:




authority

lee.AuthorityFilter


encoding
GBK


loginPage
/login.jsp


proLogin
/proLogin.jsp





authority

/*
上面的配置片段为Filter指定了3个配置参数,指定loginPage为/login.jsp,proLogin为/proLogin.jsp。这表明,如果没有登录该应用,普通用户只能访问login.jsp和proLogin.jsp页面,只有当用户登录之后才可以自由访问其他页面。

在web.xml中配置Filter,只用init-param元素为该Filter配置参数,init-param可接收如下两个子元素:

param-name:指定参数名

param-value:指定参数值

另外,filter-class中指定的过滤器类需继承javax.servlet.Filter,并且必须有以下三种方法:

init(FilterConfig filterConfig):初始化,一般情况下读取配置文件中的init-param参数值,如filterConfig.getInitParameter("encoding")

doFilter(...):用于对request,response进行处理,并通过chain.doFilter(...)交给下一个控制器

destroy():资源销毁



你可能感兴趣的:(Java)