zoukankan      html  css  js  c++  java
  • SpringBoot中使用自定义拦截器

    一、新建一个SpringBoot工程,目录结构如下:

    二、在核心配置文件application.properties中配置视图解析器格式

    #配置视图解析器解析文件的格式
    spring.mvc.view.prefix=/
    spring.mvc.view.suffix=.html

    三、新建一个自定义拦截器类:LoginInteceptor.java,拦截器作用于请求进入到controller之前。

    package cn.com.winson.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * 自定义登录拦截器
     * 
     * @author lvhao
     * @date 2018年12月8日
     * @time 上午10:14:37
     */
    public class LoginInterceptor implements HandlerInterceptor {
    
        @Override
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
    
        }
    
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
    
        }
        
        /*在请求进入到controller之前会调用此方法,所以在该方法中编写拦截逻辑*/
        @Override
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
            System.out.println("验证登录认证,并遵守拦截器规则,现在放行");
            /*这里省略了拦截器的逻辑设计,直接认证通过*/
            /*既然认证通过,返回值就为true,逻辑可以继续往下执行*/
            return true;
        }
    
    }

    四、自定义拦截器拦截配置类(拦截规则)LoginInterceptorConfig.java类:该类继承WebMvcConfigurerAdapter适配器,并重写其中的addInterceptors方法,添加一个拦截器及拦截规则。

    注意:@Configuration注解的使用。

    package cn.com.winson.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    import cn.com.winson.interceptor.LoginInterceptor;
    
    /**
     * 自定义的登录拦截器的配置类
     * 
     * @author lvhao
     * @date 2018年12月8日
     * @time 上午10:23:07
     */
    /* @Configuration注解:相当于是一个spring的配置文件(applicationContext.xml) */
    @Configuration
    public class LoginInterceptorConfig extends WebMvcConfigurerAdapter {
    
        /* 重写WebMvcConfigurerAdapter方法:作用为添加一个拦截器,添加拦截器拦截规则 */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            /*拦截和不拦截的路径参数都可以是数组*/
            String[] excludePathPatterns ={"/winson/login","/winson/logout"};
            registry.addInterceptor(new LoginInterceptor())
                    /*表示对以winson开头的请求地址都进行拦截*/
                    .addPathPatterns("/winson/**")
                    /*表示对以winson开头,后面紧跟着的是login的请求地址,不进行拦截,exclude表示排除*/
                    .excludePathPatterns(excludePathPatterns);
            
            /*拦截器可以同时存在好几个,如下,我们再写一个拦截*/
            String[] tomexcludePathPatterns ={"/tom/login","/tom/logout"};
            registry.addInterceptor(new LoginInterceptor())
            /*表示对以winson开头的请求地址都进行拦截*/
            .addPathPatterns("/tom/**")
            /*表示对以winson开头,后面紧跟着的是login的请求地址,不进行拦截,exclude表示排除*/
            .excludePathPatterns(tomexcludePathPatterns);
        }
    
    }

    五、新建一个IndexController.java,接收请求:

    package cn.com.winson.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class IndexController {
        
        /*登录页*/
        @GetMapping("/winson/login")
        public String login() {
            return "login";
        }
        /*退出页*/
        @GetMapping("/winson/logout")
        public String logout() {
            return "logout";
        }
        /*用户信息列表页*/
        @GetMapping("/winson/userInfo")
        public String userInfo() {
            return "userInfo";
        }
    
    }

    六、新建三个页面login.html、logout.html、userInfo.html内容如下:

    注意:新建的页面位置为:/src/main/webapp目录下,这是SpringBoot视图解析器寻找视图的默认的位置。

    login.html:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <center>
            <h2 style="color: red">登录页</h2>
            <hr>
        </center>
    </body>
    </html>
    View Code

     logout.html:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <center>
            <h1 style="color: green;">退出页</h1>
            <hr>
        </center>
    </body>
    </html>
    View Code

    userInfo.html:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <center>
            <hr>
            <h2 style="color: blue">用户列表页</h2>
        </center>
    </body>
    </html>
    View Code

    七、测试方法:通过测试访问各个页面,查看控制台是否打印出“验证登录认证,并遵守拦截器规则,现在放行”这段文字,判断自定义的拦截器是否进行了验证拦截器规则,如果打印该句话,证明拦截器起作用了,验证拦截器规则;如果没有打印,那么说明拦截器没有对该访问路径进行拦截器规则验证,直接放行了。

    八、运行程序,结果为:

    访问http://127.0.0.1:8080/winson/login:

    结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

    访问http://127.0.0.1:8080/winson/logout:

    结果:控制台没有打印这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

    访问:http://127.0.0.1:8080/winson/userInfo

    结果:控制台打印了这句话:“验证登录认证,并遵守拦截器规则,现在放行”。

    控制台打印结果:

    总结:

    一、通过访问页面,控制台是否打印信息,简单的验证拦截器是否拦截请求。

    二、请求是在进入到controller之前进行拦截认证的。

    三、拦截认证规则可以自定义,我这里没有进行逻辑编写,只是向控制台打印信息,来判断拦截器的拦截是否起作用。

    四、实际开发中,使用shio或者Spring Security来对登录认证,权限管理进行开发,都是框架,不用自定义拦截器这种low的方法,但是他们的原理都是使用拦截器,故我这里简单介绍一下拦截器的工作原理和流程,以后有时间,我会将Spring Security的使用进行讲解。

    代码地址:https://gitee.com/top_one/springboot-interceptor.git

  • 相关阅读:
    演义江湖PC端意见汇总
    演义江湖移动端内存优化意见汇总
    BitmapData类介绍
    我的职业规划_2013-7-29
    总结调用Flash的几种方法
    Pycharm注册
    删除表
    读取url中某个值
    Pycharm常用快捷键
    pip3使用
  • 原文地址:https://www.cnblogs.com/elnimo/p/10087152.html
Copyright © 2011-2022 走看看