美文网首页
拦截器在springboot项目和ssm架构项目的应用

拦截器在springboot项目和ssm架构项目的应用

作者: 青青子衿zq | 来源:发表于2020-04-02 10:53 被阅读0次

    1.拦截器的主要功能

    在访问某节点url前拦截客户端发来的请求,判断该请求是否符合自己定义的要求,如果不符合,返回false,该节点url的对应代码不会被执行;如果符合,返回true,可以执行该节点url。

    2.在springboot项目中的应用方法

    假设有这么一个场景:某电商网站的商品必须登陆后才能查看内容,否则无法进入商品页,那么处理方法就是使用拦截器,具体如下:

    创建一个类,命名LoginIntercepter ,该类实现HandlerInterceptor接口,该类上加上@Component注解,加载进spring容器中

    实现接口后,有三个方法需要我们处理,分别是preHandle,postHandle,afterCompletion;其中preHandle是访问controller接口之前执行的,在这里我们要写相关逻辑,判断登录状态;postHandle调用前提是preHandle返回true,它是在controller接口方法执行完毕和DispatcherServlet进行视图的渲染之前进行的;afterCompletion用于DispatcherServlet进行视图的渲染之后,多用于清理资源。这里主要用preHandle方法,代码如下:

    //这个方法是在访问接口之前执行的,我们只需要在这里写验证登陆状态的业务逻辑,就可以在用户调用指定接口之前验证登陆状态了

    @Override

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

    //每一个项目对于登陆的实现逻辑都有所区别,我这里使用最简单的Session提取User来验证登陆。

        HttpSession session = request.getSession();

    //这里的User是登陆时放入session的

        String user = (String) session.getAttribute("username");

    //如果session中没有user,表示没登陆

        if (user ==null){

    //这个方法返回false表示忽略当前请求,如果一个用户调用了需要登陆才能使用的接口,如果他没有登陆这里会直接忽略掉

    //可以重定向到登录接口,让为登录的用户去先登录

            response.sendRedirect("/luckmoney/nongyebank");

    return false;

    }else {

    return true;//如果session里有user,表示该用户已经登陆,放行,用户即可继续调用自己需要的接口

        }

    }

    至于postHandle和afterCompletion可以不写。

    下面开始配置拦截器,代码如下:

    @Configuration   //生命配置类,该类实现WebMvcConfigurer 接口

    public class WebConfigurer implements WebMvcConfigurer {

    @Autowired

        private LoginIntercepter  loginIntercepter;  //注入自己写的拦截器

    // 这个方法是用来配置静态资源的,比如html,js,css,等等

        @Override

        public void addResourceHandlers(ResourceHandlerRegistry registry) {

    }

    // 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效,addPathPatterns("/**")即是添加的拦截路径,也就是拦截controller的所有接口;.excludePathPatterns("/nongyebank","/login")即是放行的controller接口,这些接口不会被拦截,常用的登录接口和注册接口等不必拦截。

        @Override   

        public void addInterceptors(InterceptorRegistry registry) {

    registry.addInterceptor(loginIntercepter).addPathPatterns("/**").excludePathPatterns("/nongyebank","/login");

    }

    }

    这样springboot的拦截器配置完成,这是一个登录的拦截器,目的是防止用户跨过登录直接访问其他内容。

    2.在ssm架构项目中的应用方法

    ssm架构项目就是spring,springmvc,mybaties的整合,这里的拦截器,主要是在xml中配置的,但是,自己也要定义一下拦截器

    假设还是登录拦截的需求,自己写的拦截器和上一个springboot项目的一样,只是在配置上不一样了,springboot用的是注解形式来配置自己的拦截器,而ssm则是在xml中配置,这里是在spring-mvc.xml中配置拦截器:

    配置如下

    <mvc:interceptors>

    <mvc:interceptor>

    <!--

    /**的意思是所有文件夹及里面的子文件夹

    /*是所有文件夹,不含子文件夹

    /是web项目的根目录

    -->

            <mvc:mapping path="/**" />

            <mvc:exclude-mapping path="/aileqi/user"/>

    <mvc:exclude-mapping path="/aileqi/register"/>

    <mvc:exclude-mapping path="/img/*"></mvc:exclude-mapping>

    <mvc:exclude-mapping path="/js/*"></mvc:exclude-mapping>

    <bean id="commonInterceptor" class="com.ssm.intercepter.MemberIntercepter"></bean>

        </mvc:interceptor>

    </mvc:interceptors>

    这里,放行的仍然是注册登录和js,img等静态资源,用<bean>标签将自己写的拦截器注入spring容器中,运行项目,可以发现只有放行的接口可以访问,其他的需要在登录后才能访问。

    这样,拦截器在springboot项目和ssm架构项目的应用就简单实现了。

    另外:如果配置多个拦截器,preHandle方法会按照配置的顺序顺序执行,而postHandle和afterCompletion是逆序执行的。

    相关文章

      网友评论

          本文标题:拦截器在springboot项目和ssm架构项目的应用

          本文链接:https://www.haomeiwen.com/subject/uxgcphtx.html