<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">第一次用Filter过滤器,所以第一次去配置使用的时候还出错了,最后还是在网上找了下资料解决了自己的问题。其实用过之后才发现这个还挺简单的。汗。。。</span>
先介绍一下Filter
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
- 调用目标资源之前,让一段代码执行。
- 是否调用目标资源(即是否让用户访问web资源)。
- 调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个FilterChain对象进来,FilterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。
下面是一个简单的使用方法:
里面的业务自定义,这里只是检查一下登录状态
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
String path = servletRequest.getRequestURI();
//得到session
Object object = servletRequest.getSession().getAttribute("user");
Object object2 = servletRequest.getSession().getAttribute("merchant");
//如果登录用户为空且请求的action为指定的这两个时就直接让这次请求访问相应的资源,否则就返回登录页面
//不为空时继续访问
if(object==null && object2==null){
if(path.contains("appUser") || path.contains("sendValidateCode")){
chain.doFilter(request, response);
}else{
servletResponse.sendRedirect(servletRequest.getContextPath()+"/web/appUser/login");
}
}else{
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
对应的web.xml配置文件
url-pattern参数也可以设置成指定的请求,可以设置多个url-pattern
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.jn.controller.payment.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/web/*</url-pattern>
</filter-mapping>
好了,最简单的应用就这样了