拦截器or过滤器

导读:本篇文章讲解 拦截器or过滤器,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

两者的区别:
1. 拦截器(interceptor)只对action请求起作用
过滤器(Filter)可以几乎对所有的请求起作用
2.过滤器是在请求进入容器(Tomcat)之后,但是请求进入Servlet之前,请求返回时也是,是在Servlet处理完之后,返回给前端之前。
在这里插入图片描述

过滤器:Filter(拦截路径,jsp页面,css,图片)
创建filter包,并创建LoginFilter类并实现Filter(import.javax.servlet.Filter;)

package com.gm.filter;

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

public class LoginFilter 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()过滤器出生
destory()过滤器死亡
doFilter()
因为我们并没有进入Servlet所以没有HttpServletRequestServletRequest是接口,而HttpServletRequest是实现,有些方法是HttpServletRequest独有的,如getSession();
HttpServletRequest即是接口也是实现,继承自ServletRequest,增加了和Http相关的方法,所以要强制转换得到想要的request和response

package com.gm.filter;

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

public class LoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //过滤器出生
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //servletRequest 是接口,HttpServletRequest是实现,但是有些方法是我们的httpservletrequest独有的,getsession
        //HttpServletRequest 接口是继承自 servletRequest接口,增加了和Http相关的方法

        //强转得到想要的request和response
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //获取session
        HttpSession session = request.getSession();
        if (session.getAttribute("userInfo") == null && request.getRequestURI().indexOf("/user/doLogin.do") == -1){
            //没有登录
            response.sendRedirect(request.getContextPath() + "/user/doLogin.do");
        }else {
            //已经登录,不拦截,继续下一个请求(继续访问)
            filterChain.doFilter(request,response);
        }
    }

    @Override
    public void destroy() {
        //过滤器死亡
    }
}

所有的请求都通过Spring-mvc中的核心处理器DispatcherServlet进行处理的,它会判断当前的一个请求是路径还是页面,所以在web.xml中配置

<!--实现filter实现登录控制-->
  <filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.gm.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/pages/*</url-pattern>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/img/*</url-pattern>
  </filter-mapping>

拦截器:Interceptor(只拦截路径,不拦截jsp页面,css,图片)
创建interceptor包,并创建LoginInterceptor类并实现HandlerInterceptor接口。

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @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 {

    }
}

其中
afterCompletion()是执行完毕,返回前拦截
postHandle()是处理过程中进行拦截
preHandle()是在拦截点进行拦截

package com.gm.interceptor;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //在拦截点进行拦截,如果返回的是true则不执行拦截点后的操作(拦截成功)
        //1.判断当前的用户不为null,判断获取当前的登陆方法
        HttpSession session = request.getSession();
//        String url = request.getRequestURI();
//        System.out.println("接受到的action为:" + url); //SSM_war_exploded/user/findAll.do
//         url.indexOf("user/doLogin.do")!=-1
        if (session.getAttribute("userInfo")!=null){
            return true;
        }else {
            //进行拦截,拦截之后返回登陆页面
            response.sendRedirect(request.getContextPath() + "/user/doLogin.do");
//            System.out.println(request.getContextPath());//SSM_war_exploded
            return false;
        }
    }

    @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 {
        // 执行完毕,返回前拦截
    }
}

而由于拦截器只对action起作用,框架中Spring-mvc是去控制表现层的,所以要在Spring-mvc中配置拦截器

    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截所有的mvc控制器-->
            <mvc:mapping path="/**"/>
            <!--放行机制,可以指定对某一个页面不进行拦截-->
            <mvc:exclude-mapping path="/user/doLogin.do"/>
            <!--指定去使用哪一个拦截器-->
            <bean class="com.gm.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

总结:拦截器和过滤器其实都是AOP编程思想的实现,都可以体现权限检查。
不同之处:
1.使用范围不同:filter是Servlet规定规范规定的,只能用于web程序中,而拦截器既可以用在web中,又可以用在Application、Swing程序中。
2.规范不同:filter是Servlet规定规范规定的,是Servlet容器支持的。拦截器是在Spring容器内的,是Spring框架支持的。
3.使用的资源不同:拦截器是Spring的一个组件,归Spring管理配置在Spring的文件中,可以使用Spring内的任何资源、对象(可以粗浅的认为是IOC容器中的Bean对象),而Filter则不能使用访问这些资源;
4.深度差异:Filter只在Servlet前后起作用,而拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度作处理(这里也在一定程度上论证了拦截器是利用java的反射机制实现的),所以在Spring框架中,优先使用拦截器;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81932.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!