Servlet中过滤器Filter的使用
1.Filter过滤器简介
在Servlet中,有时我们需要Filter来进行对信息的过滤,比如在一个管理系统中,我们可以设置过滤器来过滤没有登录的用户访问主页以提高系统的安全性。
2.过滤器的优点:
- 过滤器是可插拔的,我们不需要某个过滤器时,直接删掉不会影响程序的运行。
- 一个过滤器不依赖于另一个资源
- 维护少,容易维护
3.过滤器的创建
- 要创建一个过滤器,必须实现Filter接口
Filter接口为过滤器提供了声明周期方法:
2.以下是创建一个过滤器的代码:实现Filter接口,注意:导入的包是import javax.servlet.*;
package com.gzx.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
init:接口初始化时会执行。
doFilter:相当于是一个拦截器,如果用户的操作不满足方法里面的要求,那么我们可以对它进行操作,如一个用户没有登录而访问了后台系统。我们可以进行如下操作:
// 用户没有登录
if (session.getAttribute("sessionUser") == null) {
// 1.不需要登录的请求不拦截
String resource = uri.substring(uri.lastIndexOf("/") + 1);
// System.out.println(uri.substring(uri.lastIndexOf("/") + 1));
// 不需要登录就可以访问的资源
if ("login.jsp".equals(resource) || "login".equals(resource)) {
chain.doFilter(request, response);
} else if (uri.contains("/api/get") || uri.contains("/api/post")) {
chain.doFilter(request, response);
}
// 不合法的请求 用户没有登录 却访问了一个需要登录以后才可以访问的系统资源 这时候重定向到登录页面 让用户登录
else {
// 重定向到系统登录页面
response.sendRedirect("login.jsp");
}
}
// 用户已经登录了 继续下面的请求
else {
chain.doFilter(request, response);
}
注意,当用户的操作已经满足要求,那么我们要执行一行代码:
chain.doFilter(request, response); 这行代码相当于放行的意思,取消拦截,我们可以把 网页的request和response传到下一个页面。
3.Filter的配置!
上面是Filter的创建,那么接下来是Filter的注册,如果没有进行注册的话,我们的程序是无法识别并找到你所写的Filter的,下面我提供2种配置方法
1.通过配置web.xml文件:我们需要配置filter和filter-mapping两个选项
<web-app>
<filter>
<!--过滤器的名字,这个我们可以自定义名字,但是必须跟下面的mapping中的name一致-->
<filter-name>myFilter</filter-name>
<!--filter-class是你所创建的Filter的具体位置,格式如下!!!这里千万不能写错,不然系统找不到你的过滤器-->
<filter-class>com.gzx.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<!--mapping中的filter和上面我们定义的filter-name必须一致-->
<filter-name>myFilter</filter-name>
<!--url-pattern是这个过滤器的作用范围,'/*'表示对所有的类生效-->
<url-pattern>...</url-pattern>
</filter-mapping>
</web-app>
2.当然还有一种特别简便的方法,此方法我们不需要配置web.xml文件即可对Filter进行注册:通过注解。
在我们刚才创建的Filter中加上这一句@WebFilter("/*")即可对Filter进行配置。