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中进行相关配置。 

    <filter>
        <filter-name>ManagerFilter</filter-name>
        <filter-class>project.filter.ManagerFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ManagerFilter</filter-name>
        <url-pattern>/html/manager.html</url-pattern>
    </filter-mapping>

拦截器(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:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/manager/**"/>
            <bean class="project.interceptor.ManagerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值