您的位置:首页 > 其它

web.xml 配置Filter

2011-01-18 12:42 309 查看
下面是该Filter的源代码。

程序清单:codes/02/2.12/ filterTest/WEB-INF/src/lee/AuthorityFilter.java

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方法里3行斜体字代码用于获取Filter的配置参数,而程序中粗体字代码则是此Filter的核心,①号代码按配置参数设置了request编码所用的字符集,接下来的粗体字代码判断session范围内是否有user属性——没有该属性即认为没有登录,如果既没有登录,而且请求地址也不是登录页和处理登录页,系统直接跳转到登录页面。

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

param-name:指定参数名。

param-value:指定参数值。

该Filter的配置片段如下:

<!-- 定义Filter -->
<filter>
<!-- Filter的名字 -->
<filter-name>authority</filter-name>
<!-- Filter的实现类 -->
<filter-class>lee.AuthorityFilter</filter-class>
<!-- 下面3个init-param元素配置了3个参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>proLogin</param-name>
<param-value>/proLogin.jsp</param-value>
</init-param>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>authority</filter-name>
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>


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

<servlet>
<servlet-name>action<servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>

<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>

<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


<load-on-startup>2</load-on-startup>配置的作用

1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6)当值相同时,容器就会自己选择顺序来加载。

本文来自CSDN博客,转载出处:http://blog.csdn.net/doymm2008/archive/2009/11/09/4791435.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: