您的当前位置:首页Java中Filter(过滤器)的使用

Java中Filter(过滤器)的使用

2024-12-13 来源:哗拓教育

Filter的作用

Filter在Java web应用中起到拦截器的作用,常见使用场景是检查是否已登陆.敏感词汇过滤等,作为Servlet的核心技术被广泛使用在各个方面

Filter的功能

Filter能在请求到达Servlet之前修改请求和响应的信息,经过判断以后决定是否要放行改(修改)请求的内容.

Filter的使用

Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

使用的第一步,是需要在web.xml中配置Filter,主要是配置Filter对应的实体类和配置拦截请求的样式,配置方法如下:

<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>cn.wufeng.core.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>

第二步编写实体类,要实现Filter接口

里面包含了三个需要实现的方法:


 public void destroy();//销毁的时候可以同时销毁FilterConfig 的配置
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;//必须经过的方法,需要判断的条件可以写在里面
 public void init(FilterConfig filterConfig) throws ServletException;//初始化会调用的方法,

doFilter里面,进行了业务所需要的判断,如果准予放行,则调用chain.doFilter(request, response);方法放行.
例子如下:

package cn.wufeng.core.filter;

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;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import cn.itcast.core.constant.Constant;
import cn.itcast.core.permission.PermissionCheck;
import cn.itcast.nsfw.user.entity.User;

public class LoginFilter implements Filter {

    @Override
    public void destroy() {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String uri = request.getRequestURI();
        //判断当前行为是否为登陆请求
        if(!uri.contains("sys/login_")){
            
            //已经登陆过的时候直接放行
            if(request.getSession().getAttribute(Constant.USER) !=null){
                //权限坚定
                if(uri.contains("/nsfw")){
                    User user =(User)request.getSession().getAttribute(Constant.USER);              
                    WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

                    PermissionCheck pc = (PermissionCheck) applicationContext.getBean("permissionCheck");
                    
                    if (pc.isAccessible(user,"nsfw")){
                        //说明有权限,放行
                        chain.doFilter(request, response);
                    }else{
                        //没有权限,跳转到没有权限的提示页面
        response.sendRedirect(request.getContextPath()+"/sys/login_toNoPermissionUI.action");
                        
                    }

                }else{
                    
                    chain.doFilter(request, response);
                }
                
            }else{
                //没有登陆的时候跳转到登陆页面
                response.sendRedirect(request.getContextPath()+"/sys/login_toLoginUI.action");
            }
        }else{
            //登陆请求,直接放行
            chain.doFilter(request, response);  
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

显示全文