过滤器能够完成什么功能呢?过滤器就好像是在客户端与服务端之间建立了一道道门,客户端发出的请求必须通过这一道道门后才能进入到服务端拿取数据。而这一道道门就相当于是一个个过滤器,通过第一个过滤器才能到达第二个过滤器,依次往后过滤,全部过滤通过才能请求到服务端。利用这个方法我们可以完成比如说:设置编码格式、过滤登出用户,过滤访问权限不足的用户等等功能。
配置过滤器实际上是实现过滤器的接口,并从写其中的三个方法:doFilter(request,response,chain),init()、destroy()。一般只需要在doFilter方法中进行过滤操作。其他两个方法不需要重写什么代码。
下面是一个简单的过滤登出用户的功率器代码,目的是防止用户未登录就进入到操作页面:
public class LoginRedirect implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 强转
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
// 解决重复登录的问题:session里面有登录数据就不需要在登录
// 简单判断缓存中是否有登录用户
if (session.getAttribute("userid") == null) {// 没有用户
String path = request.getRequestURI();
if (path.indexOf("/Login.jsp") > -1 // 登录页面不过滤
|| path.indexOf("/UserServlet") > -1) {
chain.doFilter(request, response); // 放行,交给下一个过滤器
return;
} else {
// 没登录,驳回访问请求并重定向到登录页面
response.sendRedirect(request.getContextPath() + "/jsp/Login.jsp");
return;
}
} else {
chain.doFilter(request, response); // 放行,交给下一个过滤器
return;
}
}
@Override
public void destroy() {
}
}
有两点需要注意:第一点是如果你不能保证在同一个过滤器中只会执行一次放行的操作的话,那么最好在每次方行的代码后加一句return,否则可能会报一个关于多次转发或跳转的异常。第二点就是有的项目可能会有一些操作不需要登录就能进行操作,比如说注册等等功能,那么对于这类的请求后台的操作就不能让过滤器把它过滤掉,有两种方法可以实现,一种是在web.xml中配置一下过滤器的过滤的范围,另一种就是把这类不需要登录就能请求后台的请求方法都放到一个servlet中,然后并不过滤这个servlet就行了,就像我上面的代码path.indexOf("/UserServlet")一样。
web.xml中配置过滤器,有一点可以了解下:服务器在加载的时候按:监听器>过滤器>Servlet的顺序加载的。
<filter>
<filter-name>LoginRedirect</filter-name> <!-- 过滤器名称 -->
<filter-class>com.sanyitong.fliter.LoginRedirect</filter-class> <!-- 过滤器类的包路径 -->
</filter>
<filter-mapping><!-- 过滤器映射 -->
<filter-name>LoginRedirect</filter-name>
<url-pattern>/servlet/*</url-pattern> <!-- 过滤器作用的对象 -->
</filter-mapping>
过滤器配置说明:< filter-class >是指明过滤器类在项目中所处的包路径。< url-pattren>是定义过滤器作用的对象或范围。< url-pattren>配置有以下规则:
- 作用与所有web资源:<url—pattern>/*</ url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。
- 作用于某一文件夹下所有文件:<url—pattern>/jsp/*</ url-pattern>
- 作用于某一种类型的文件:<url—pattern>.扩展名</ url-pattern>。比如<url—pattern>.jsp</ url-pattern>过滤所有对jsp文件的访问请求。
- 作用于某一文件夹下某一类型文件:<url—pattern>/jsp/*.扩展名</ url-pattern>
最后在说一下,如果一个过滤器要过滤多个作用对象或范围,那么就配置多个< filter-mapping>来定义过滤规则,一个< filter-mapping>定义一个< url-pattren>过滤对象或范围。
最后在说一下,如果一个过滤器要过滤多个作用对象或范围,那么就配置多个< filter-mapping>来定义过滤规则,一个< filter-mapping>定义一个< url-pattren>过滤对象或范围。