zoukankan      html  css  js  c++  java
  • Spring boot自定义拦截器和拦截器重定向配置简单介绍

    大家好:

      本文简单介绍一下用于权限控制的Spring boot拦截器配置,拦截器重定向问题。

    开发工具:jdk1.8   idea2017(付费版,网上找的破解教程)

    1,首先使用idea创建一个Spring boot+jsp的简单项目,结构目录如下:

    2.创建filter文件夹,在文件夹创建CheckFilter.java文件,继承拦截器基础接口HandlerInterceptor,并实现以下三个方法:

    preHandle:核心方法,请求处理器,只有该方法返回true,才会继续执行后续的Controller。
    postHandle:DispatcherServlet进行视图返回渲染之前进行调用
    afterCompletion:在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理

     

    3,在filter文件中创建 WebMvcConfig.java文件,继承类 WebMvcConfigurationSupport(拦截器的配置类,主要配置拦截器的相关参数),并继承以下方法:

    addInterceptors:添加拦截器实例
    addResourceHandlers:静态文件访问配置
    configureViewResolvers:视图配置

       

    4,最终代码展示

    拦截器

    package com.example.filter;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CheckFilter implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            System.out.println("拦截器访问方法:"+request.getServletPath());
    
            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 {
    
        }
    }
    CheckFilter.java

    拦截器配置类

    因为WebMvcConfigurationSupport不走自动化的配置文件,所以一些静态文件,视图配置需要自己手动再添加一下

    package com.example.filter;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.*;
    
    @Configuration
    public class WebMvcConfig extends WebMvcConfigurationSupport {
    
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new CheckFilter()).addPathPatterns("/**").
                    excludePathPatterns("/testBean/test");
            super.addInterceptors(registry);
        }
    
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
            super.addResourceHandlers(registry);
        }
    
        @Override
        protected void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp("/WEB-INF/",".jsp");
            super.configureViewResolvers(registry);
        }
    }
    WebMvcConfig.java
    addInterceptors(InterceptorRegistry registry):添加拦截器,并且配置拦截路径等参数
      addInterceptor(new CheckFilter()):添加实例化的拦截器
      addPathPatterns("/**") :配置拦截器拦截的路径
      excludePathPatterns("/testBean/test"):配置不进去拦截器的方法,多少个就可以像这样儿在后面一直添加,excludePathPatterns("/testBean/test","","",........).
    ddResourceHandlers(ResourceHandlerRegistry registry):静态文件访问配置
    onfigureViewResolvers(ViewResolverRegistry registry):试图配置

    测试的bean
    package com.example.demo;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("testBean")
    public class TestBean {
    
        @RequestMapping("testDemo")
        public String TestDemo(){
    
            return "hello";
        }
    
        @RequestMapping("test")
        public String test(){
            return "test";
        }
    }
    TestBean.java

    配置文件

    #访问相关配置
    server.port=8080
    server.tomcat.uri-encoding=UTF-8
    #项目访问名称,如果不配置直接访问bean就可以
    server.servlet.context-path=/springBoot_demo
    
    #数据库配置
    spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL
    spring.datasource.username=silver
    spring.datasource.password=silver
    
    #Spring boot视图配置
    spring.mvc.view.prefix=/WEB-INF/
    spring.mvc.view.suffix=.jsp
    #静态文件访问配置
    spring.mvc.static-path-pattern=/static/**
    application.properties

    两个简单jsp

    <%--
      Created by IntelliJ IDEA.
      User: gen
      Date: 2018/7/25
      Time: 17:34
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        Hello,World!
    </body>
    </html>
    hello.jsp
    <%--
      Created by IntelliJ IDEA.
      User: gen
      Date: 2018/8/23
      Time: 16:33
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        拦截器访问!
    </body>
    </html>
    test.jsp

    4,开始测试代码

    打开浏览器访问TestBean.java的第一方法

    http://localhost:8080/springBoot_demo/testBean/testDemo

    出现访问拦截器的文字,测试成功

    打开浏览器访问TestBean.java的第二方法,这个方法配置不走拦截器

    http://localhost:8080/springBoot_demo/testBean/test

    如果进入拦截器应该会再多出现一行文字,没有出现第二行字代表着测试成功,没有进入拦截器

    5.拦截器的重定向配置

    关于这个重定向问题,在spring mvc中可以在拦截器中直接重定向到jsp中,例如这样儿:response.sendRedirect(request.getContextPath()+"/mainFunction/errorMsg.jsp");

    但是spring boot这样写会报错,我在网上找了好多关于拦截器重定向文章,没有发现直接访问jsp的写法,都是一个方案,直接重定向到bean的方法,然后返回到你想要页面.

    简单修改代码:

    在CheckFilter.java的preHandle方法中添加两行:
    HttpSession seesion = request.getSession();
    response.sendRedirect(request.getContextPath()+"/testBean/test");
    在请求已经响应后创建seesion会后台报错,所以需要添加获取session,在请求结束前创建session
    这个方案需要将/testBean/test配置为不进入拦截器,要不然就会是一个无限重定向的死循环。
    因为上面我已经将/testBean/test加入到不进去拦截器的配置中,所以WebMvcConfig.java就不需要再改了

    修改后代码:
    package com.example.filter;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CheckFilter implements HandlerInterceptor {
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
            System.out.println("拦截器访问方法:"+request.getServletPath());
            response.sendRedirect(request.getContextPath()+"/testBean/test");
            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 {
    
        }
    }
    CheckFilter.java

    6.重启项目,测试重定向是否生效

    打开浏览器继续访问TestBean.java的第一方法

    http://localhost:8080/springBoot_demo/testBean/testDemo

    测试成功,正常进去test.jsp中

  • 相关阅读:
    hdu find the most comfortable road(贪心+并查集)
    hdu 迷瘴(贪心)
    Excel中指定的sheet名称或索引读取数据到DataTable
    SQLServer 批量插入数据的两种方法
    javascript基础教程3
    Enterprise Library 4.1学习笔记 配置应用程序块(c/s和b/s均适用)
    关于同一用户不能同时在两台电脑上登录问题的解决方案
    获取当天为一年中的第几周
    javascript基础教程4
    Excel导出方法选择(转自gwf25sz)
  • 原文地址:https://www.cnblogs.com/gen9201117/p/9524198.html
Copyright © 2011-2022 走看看