Java中过滤器与拦截器

在基于SSM框架的项目实战中,不管是写一个什么项目,前后台的分离是必不可少的。自JavaWeb中的过滤器,到Spring MVC中新增了拦截器,目的也是为了分离前后台。

对于二者的理解:

过滤器(FIlter):过滤器实际上是对一些web资源进行拦截 ,做一些处理后再交给下一个Servlet或者过滤器处理,它通常是用来拦截request进行处理的,也可以对返回的response进行拦截处理。

拦截器(Intercepter):拦截器主要是用于拦截用户请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等等。

二者的使用:(实现拦截后台)

过滤器(FIlter):过滤器是实现了javax.servlet下的Filter接口,重写Filter中的三个方法:初始化init,过滤doFIlter,销毁destroy,其中doFilter()方法是去实现过滤相关内容的方法。

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class ManagerFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req= (HttpServletRequest) request;
        HttpServletResponse resp= (HttpServletResponse) response;
        HttpSession session = req.getSession();
        Integer status = (Integer) session.getAttribute("status");
        System.out.println(status);
        if (session.getAttribute("status") == null || (Integer) session.getAttribute("status") != 3) {
            req.setAttribute("meg", "你没有权限访问后台!");
            System.out.println("过滤器拦截--------");
            resp.sendRedirect("/MusicWebSite/index.html");
        } else {
            System.out.println("过滤器放行------------------------");
            chain.doFilter(req,resp);
        }
    }

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

当然,过滤器的配置配置也是必不可少的,而过滤器主要是过滤页面的,就需要在web.xml中进行相关配置。 

    
        ManagerFilter
        project.filter.ManagerFilter
    
    
        ManagerFilter
        /html/manager.html
    

拦截器(Intercepter):而定义一个拦截器,一般可以通过实现HandlerInterceptor接口或者继承HandlerInterceptor接口的实现类定义,还有一种已经过时的方法是通过WebRequestInterceptor接口或者继承WebRequestInterceptor接口的实现类定义,拦截器中的三个方法:

preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法

postHandle:控制器方法执行之后执行postHandle()

afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()



import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class ManagerInterceptor extends HttpServlet implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Integer status = (Integer) session.getAttribute("status");
        if (session.getAttribute("status") == null || (Integer) session.getAttribute("status") != 3) {
            request.setAttribute("meg", "你没有权限访问后台!");
            System.out.println("拦截器拦截--------");
            response.sendRedirect("/index.html");
            return false;
        } else {
            System.out.println("拦截器放行------------------------");
            return true;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
     
    }
}


     
        
            
            
        
    

其中mvc:mapping是你需要拦截的controller的url,如果你不需要排除一些特定的url,就需要使用mvc:exclude-mapping属性。

你可能感兴趣的:(mvc,spring,java)