一、设置web.xml
1.增加过滤器配置
在web.xml文件中增加过滤器项,示例如下:
<filter> <filter-name>AuthFilter</filter-name> <filter-class>com.etrans.bubiao.sys.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
2.基本说明
即增加filter和filter-mapping项,它们对应的filter-name作为匹配标识是一样的,filter-class对应我们要实现的过滤器的代码类,url-pattern标识要过滤的url。
前面示例中的配置会使得应用服务器把.jsp后缀的请求全部交给com.etrans.bubiao.sys.AuthFilter的实例化对象来处理(注意:每种过滤器只有一个实例)。
3.扩展说明
a.可以有多个url-pattern,对多种条件下的资源进行过滤。
b.filter段内可以加入init-param段,其中可以增加一些过滤器的初始化参数。这些参数可以在过滤器代码的init方法中提取。
示例:
<!-- 防止无权限直接访问页面 --> <filter> <filter-name>AuthFilter</filter-name> <filter-class>com.etrans.bubiao.sys.AuthFilter</filter-class> <init-param> <param-name>exclude</param-name> <param-value>/ygclogin.html,/authImg</param-value> </init-param> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.htm</url-pattern> <url-pattern>*.html</url-pattern> </filter-mapping>
二、过滤器代码编写
1.生成java类
类名就是前面配置文件中filter-class指定的名字,并且该类要实现javax.servlet.Filter接口。自动生成的代码如下:
package com.etrans.bubiao.sys; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class AFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }
2.完成外围代码
在init函数内增加相关代码,如读取初始化参数等。注意:声明的类变量无需标识为static,因为本类只有一个实例。
在destroy函数内增加相关代码,如清理环境等。
3.完成业务代码
在doFilter函数内增加代码,对浏览器申请的资源进行过滤。注意:如果本过滤器不需要拦截的内容,则应调用过滤器链继续处理,否则浏览器里面就成空白的了。
4.示例代码
package com.etrans.bubiao.sys; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthFilter implements Filter { private String[] excludeList; @Override public void destroy() { } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) arg0; HttpServletResponse resp = (HttpServletResponse) arg1; String url = req.getRequestURI(); String baseUrl = req.getContextPath() + "/"; String user = (String) req.getSession().getAttribute("user"); if (null == user) { boolean isExclude = url.equals(baseUrl); if (!isExclude) { for (String exclude: excludeList) { if (url.endsWith(exclude)) { isExclude = true; break; } } } if (!isExclude) { System.out.println("请重新登录!因为您对此页面没有权限:" + url); System.out.println("您将被重定向到:" + baseUrl); resp.sendRedirect(baseUrl + "ygclogin.html"); return; } } arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { String exclude = arg0.getInitParameter("exclude"); excludeList = exclude.split(","); } }