精华内容
下载资源
问答
  • springboot配置拦截器springboot中配置拦截器大体上分为以下几步1.引入相关的依赖2.新建拦截器3.配置拦截器Bean虽然网上有很多配置方法,但是我更倾向于官方文件的配置方法,在以后的DEMO中也会是尽量和官方文档进行...

    springboot配置拦截器

    在springboot中配置拦截器大体上分为以下几步1.引入相关的依赖2.新建拦截器3.配置拦截器Bean虽然网上有很多配置方法,但是我更倾向于官方文件的配置方法,在以后的DEMO中也会是尽量和官方文档进行贴合参考文档:https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/web.html#mvc-config-interceptors

    引入依赖

    只需要引一个web的依赖就可以了

    implementation 'org.springframework.boot:spring-boot-starter-web'

    新建拦截器

    如果不知道如何新建,可以参考Spring源码中的LocaleChangeInterceptor

    /** * 测试拦截器,继承的类参考 Spring源码中LocaleChangeInterceptor * 和ThemeChangeInterceptor写法 * @Author https://www.javastudy.cloud * @CreateTime 2019/11/8 **/public class TestInterceptor extends HandlerInterceptorAdapter {    /**     * 这个方法在HandlerMapping找到对应的处理对象,但还没有请求这个对象时处理     * 也就是在Controller的方法之前执行     *     * @param request     * @param response     * @param handler  这个参数就是代码着Controller的方法     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("run in pre Handle");        return true;    }    /**     * 在Handler/controller的方法处理完逻辑,渲染视图之前执行     *     * @param request     * @param response     * @param handler     * @param modelAndView     */    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("run in post Handle");    }    /**     * 在视图渲染完之后执行,常用于资源清理等等     *     * @param request     * @param response     * @param handler     * @param ex     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        super.afterCompletion(request, response, handler, ex);    }}
    配置拦截器Bean

    不知道如何配置的同学可以参考上述给出的spring官方文档

    /** * @Author https://www.javastudy.cloud * @CreateTime 2019/11/8 **/@Configuration@EnableWebMvcpublic class WebConfig implements WebMvcConfigurer {    /**     * 在这里添加自己定义的拦截器     * @param registry     */    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new TestInterceptor())                // 只拦截test路径        .addPathPatterns("/test/**")                // 不拦截pass路径        .excludePathPatterns("/pass/**");    }}

    编写测试的controller

    这块就写的很随意了

    /** * @Author https://www.javastudy.cloud * @CreateTime 2019/11/8 **/@RestControllerpublic class TestController {    @RequestMapping("test/testInterceptor")    public String testInterceptor(){        System.out.println("in test method");        return "";    }    @RequestMapping("pass/testPass")    public String testPass(){        System.out.println("in pass method");        return "";    }}

    结果输出

    走拦截器的情况6d92f369ddcbfc108f7a3e10943b0982.png不走拦截器的情况482036024333e824d49e01887223dfcc.png

    DEMO总评

    拦截器是Web中的一大核心概念,我们常常拿拦截器与过滤器进行比较,通过代码可简单总结,拦截器是基于springMVC的,拦截器是只对Controller方法做修改.等等还有很多特性小伙伴们可以自行总结下,常见用法,如文档中所示,可用于本地化,可用于安全验证等等

    可添加小刀微信获取源码

    93beaca29eae97ee1b7f2c8307c1626c.png

    7a172d1a737cf337f2dccbeca4e9da99.png往期热文docker|docker安装redis数据结构|用java自己手写实现一个栈springboot|springboot新建aop切面springboot|springboot配置定时任务及常用的cron表达式点在看的都没有bug!!!
    展开全文
  • JavaSpringBoot拦截器一般都可以做什么?可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。SpringBoot拦截器实现登录拦截pom.xml:<?xml version="1.0" encoding="UTF...

    Java中SpringBoot拦截器一般都可以做什么?

    可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。

    6770b14edf26a5e8fe2eb70941ef4a1c.png

    SpringBoot拦截器实现登录拦截

    pom.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.0.RELEASE</version>
     <relativePath/>
     </parent>
     <groupId>com.wyj</groupId>
     <artifactId>springboot-interceptor01</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <name>springboot-interceptor01</name>
     <description>springboot拦截器</description>
     
     <properties>
     <java.version>1.8</java.version>
     </properties>
     
     <dependencies>
     <!-- springboot -->
     <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
     </dependency>
     <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
     <scope>runtime</scope>
     <optional>true</optional>
     </dependency>
     
     <!-- lombok -->
     <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
     </dependency>
     
     <!-- thymeleaf -->
     <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
     </dependency>
     </dependencies>
     
     <build>
     <finalName>springboot-interceptor01</finalName>
     <plugins>
     <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     </plugin>
     </plugins>
     </build>
    </project>
    

    WebMvcConfigurer:继承WebMvcConfigurationSupport类,重写addInterceptors方法

    /**
     * 在springboot2.0.0之后,WebMvcConfigurerAdapter已经过时了
     * 会使用WebMvcConfigurer或者WebMvcConfigurationSupport替代
     *
     * @author wyj
     * @create 2019-06-01 21:48
     */
    @Configuration
    public class WebMvcConfigurer extends WebMvcConfigurationSupport {
     
     /**
     * 在springboot2.0.0之前继承WebMvcConfigurerAdapter类,重写addInterceptors方法
     *
     * @param registry
     */
    // @Override
    // public void addInterceptors(InterceptorRegistry registry) {
    // /**
    // * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
    // */
    // registry.addInterceptor(new AuthorityInterceptor())
    // .addPathPatterns("/user/**");
    // super.addInterceptors(registry);
    // }
     
     /**
     * 在springboot2.0.0之后实现WebMvcConfigurer接口,重写addInterceptors方法
     *
     * @param registry
     */
    // @Override
    // public void addInterceptors(InterceptorRegistry registry) {
    // /**
    // * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
    // */
    // registry.addInterceptor(new AuthorityInterceptor())
    // .addPathPatterns("/user/**");
    // }
     
     /**
     * 在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法
     *
     * @param registry
     */
     @Override
     protected void addInterceptors(InterceptorRegistry registry) {
     /**
     * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
     */
     registry.addInterceptor(new AuthorityInterceptor())
     .addPathPatterns("/user/**");
     super.addInterceptors(registry);
     }
    }
    

    AuthorityInterceptor:实现HandlerInterceptor接口,重写preHandlepostHandleafterCompletion方法

    preHandle:在请求处理之前进行调用(Controller方法调用之前)

    postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)

    afterCompletion:在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)

    @Slf4j
    public class AuthorityInterceptor implements HandlerInterceptor {
     
     private static final Set<String> NOT_INTERCEPT_URI = new HashSet<>();//不拦截的URI
     
     static {
     NOT_INTERCEPT_URI.add("/user/login.html");
     NOT_INTERCEPT_URI.add("/user/login");
     }
     
     /**
     * 在请求处理之前进行调用(Controller方法调用之前)
     */
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
     Object object) throws Exception {
     String uri = request.getRequestURI();
     if (NOT_INTERCEPT_URI.contains(uri)) {
     log.info("不拦截" + uri);
     return true;
     }
     log.info("拦截" + uri);
     HttpSession session = request.getSession();
     UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
     if (userInfo == null) {
     throw new RuntimeException("用户未登陆");
     }
     return true;
     }
     
     /**
     * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
     */
     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception {
     }
     
     /**
     * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行
     * (主要是用于进行资源清理工作)
     */
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
     }
    }
    

    UserController:

    @Controller
    @RequestMapping(value = "/user")
    public class UserController {
     
     @RequestMapping(value = "/login.html")
     public String index() {
     return "login";
     }
     
     @RequestMapping(value = "/login")
     public String login(User user) {
     //查询数据库,我这里直接写死
     User dbUser = new User(1, "zhangsan", "123456", "admin");
     if (dbUser.getPassword().equals(user.getPassword())) {
     UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole());
     HttpSession session = getRequest().getSession();
     session.setAttribute("user_info_in_the_session", userInfo);
     return "admin";
     }
     return "login";
     }
     
     @RequestMapping(value = "/userInfo")
     @ResponseBody
     public String userInfo() {
     HttpSession session = getRequest().getSession();
     UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
     return userInfo.toString();
     }
     
     private HttpServletRequest getRequest() {
     return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
     }
    }
    

    User:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User implements Serializable {
     
     private int id;
     private String username;
     private String password;
     private String role;
     
    }
    

    UserInfo: 用于存在用户信息储存在session中

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserInfo implements Serializable {
     
     private int id;
     private String username; 
     private String role;
     
    }
    

    login.html:只是一个很简单的登录表单

    <!DOCTYPE html>
    <html>
    <head>
     <meta charset="UTF-8">
     <title>登陆页面</title>
    </head>
    <body>
    <form action="/user/login" method="post">
     登陆:<br/>
     用户名:<input name="username" id="username" type="text"/><br/>
     密 码:<input name="password" id="password" type="password"/><br/>
     <input type="submit" value="登陆"/>
    </form>
    </body>
    </html>
    

    admin.html:

    <!DOCTYPE html>
    <html>
    <head>
     <meta charset="UTF-8">
     <title>首页</title>
    </head>
    <body>
    <form action="/user/userInfo" method="get">
     <input type="submit" value="用户信息"/></form>
    </body>
    </html>
    

    欢迎一起学习交流!

    点击获取

    展开全文
  • 1、maven 依赖版本注意:本次示例的 spring-boot-starters 的版本是 2.1.132、实现步骤① 实现配置类implements WebMvcConfigurer② 实现拦截器LoginInterceptor extends HandlerInterceptorAdapter③ 把拦截器添加...

    1、maven 依赖版本

    注意:本次示例的 spring-boot-starters 的版本是 2.1.13

    2、实现步骤

    ① 实现配置类

    implements WebMvcConfigurer

    ② 实现拦截器

    LoginInterceptor extends HandlerInterceptorAdapter

    ③ 把拦截器添加到配置类中

    ④ 添加需要拦截的请求

    ⑤ 添加需要排除的请求

    3、实现配置类

    WebConfigurer

    4、拦截器

    ① preHandle 方法是进行处理器拦截用的,顾名思义,该方法将在 Controller 处理之前进行调用

    ② postHandle 在 Controller 的方法调用之后执行,但是它会在 DispatcherServlet 进行视图的渲染之前执行

    ③ afterCompletion 该方法将在整个请求完成之后,也就是 DispatcherServlet 渲染了视图执行(这个方法的主要作用是用于清理资源的)

    LoginInterceptor

    5、有时,希望链接不被拦截,可以使用自定义注解

    自定义注解LoginRequired

    在 LoginInterceptor 开始添加如下代码

    LoginInterceptor

    注意:经过研究发现,只有当 GET 请求是请求静态文件时 (在 spring 配置文件里会配置静态文件的 URI),handler 的实际类型会是 DefaultServletHttpRequestHandler,此时强制转换就会报错。需要加这行代码判断,handler instanceof HandlerMethod 。

    欢迎关注 @Python大星 ,一个会点 Python 的 Java 程序员。如果你有更好的想法,欢迎留言,一起探讨,想说你就说啊!后面继续分享Java的相关开发,人少就散了吧!

    @Python大星 | 文

    展开全文
  • 1、maven 依赖版本注意:本次示例的 spring-boot-starters 的版本是 2.1.132、实现步骤① 实现配置类implements WebMvcConfigurer② 实现拦截器LoginInterceptor extends HandlerInterceptorAdapter③ 把拦截器添加...
    234143f17d438a6c891e8596efc1c581.png

    1、maven 依赖版本

    注意:本次示例的 spring-boot-starters 的版本是 2.1.13

    ef4b0a9130c770cd65a103d8ae537f9d.png

    2、实现步骤

    ① 实现配置类

    implements WebMvcConfigurer

    ② 实现拦截器

    LoginInterceptor extends HandlerInterceptorAdapter

    ③ 把拦截器添加到配置类中

    ④ 添加需要拦截的请求

    ⑤ 添加需要排除的请求


    3、实现配置类

    01acd3b6484476ba3e7d9fc550c33567.png

    WebConfigurer

    4、拦截器

    672c7202cb924cc69abc4b206b72549c.png

    ① preHandle 方法是进行处理器拦截用的,顾名思义,该方法将在 Controller 处理之前进行调用

    ② postHandle 在 Controller 的方法调用之后执行,但是它会在 DispatcherServlet 进行视图的渲染之前执行

    ③ afterCompletion 该方法将在整个请求完成之后,也就是 DispatcherServlet 渲染了视图执行(这个方法的主要作用是用于清理资源的)

    726039ccc35bc5cbf897079cdd268807.png

    LoginInterceptor

    5、有时,希望链接不被拦截,可以使用自定义注解

    c7324b2dc2fc6162e0f9261e1599b7cb.png

    自定义注解LoginRequired

    在 LoginInterceptor 开始添加如下代码

    7b4aba8013827688370b7e0883d05c25.png

    LoginInterceptor

    注意:经过研究发现,只有当 GET 请求是请求静态文件时 (在 spring 配置文件里会配置静态文件的 URI),handler 的实际类型会是 DefaultServletHttpRequestHandler,此时强制转换就会报错。需要加这行代码判断,handler instanceof HandlerMethod 。


    欢迎关注 @Python大星 ,一个会点 Python 的 Java 程序员。如果你有更好的想法,欢迎留言,一起探讨,想说你就说啊!后面继续分享Java的相关开发,人少就散了吧!

    @Python大星 | 文

    df948f134aaee299d6a2e66792232ae9.png
    展开全文
  • SpringBoot拦截器可以做什么可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。SpringBoot拦截器实现登录拦截pom.xml:xsi:schemaLocation=...
  • SpringBoot 拦截器中校验Json数据背景做开发的时候,经常会使用@RequestBody注解,这个注解是非常的好用。但是如果你想在请求参数传到后台的时候做一个参数检验,当然可以!使用SpringMVC的拦截器,在拦截器里把...
  • 如何手写一个拦截器呢。假设我现在需要一个计时拦截器,我想把每一次调用服务锁花费的时间打印到控制台,我该怎么做呢?拦截机制有三种:1. 过滤器(Filter)能拿到http请求,但是拿不到处理请求方法的信息。2. 拦截器...
  • 今天给大家介绍一下SpringBoot拦截器的用法,相比Struts2中的拦截器SpringBoot拦截器就显得更加方便简单了。只需要写几个实现类就可以轻轻松松实现拦截器的功能了,而且不需要配置任何多余的信息,对程序员来...
  • 在基本框架搭好的前提下第一步:新建一个拦截类LoginInterceptor继承HandlerInterceptor接口package com.association.intercepter;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet...
  • 这篇文章主要介绍了Springboot引入拦截器并放行swagger代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Springboot引入拦截器自定义的拦截器类 ...
  • JavaSpringBoot拦截器一般都可以做什么?可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。SpringBoot拦截器实现登录拦截pom.xml: 4.0.0 org.springframework.boot ...
  • SpringBoot拦截器的用法,相比Struts2中的拦截器SpringBoot拦截器就显得更加方便简单了。只需要写几个实现类就可以轻轻松松实现拦截器的功能了,而且不需要配置任何多余的信息第一步:创建我们自己的拦截器类...
  • 第一步:新建一个拦截类LoginInterceptor继承HandlerInterceptor接口 package com.association.intercepter; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet....
  • 1. 拦截器的基本使用1.1 拦截器的实现类实现Spring的HandlerInterceptor接口;继承实现HandlerInterceptor接口的类,例如:HandlerInterceptorAdapter;1.2 HandlerInterceptor方法介绍boolean preHandle...
  • springboot技术内幕架构设计与...增加登录退出控制:# src/main/java/com/wu/controller/LoginController.java@Controllerpublic class LoginController {@RequestMapping("/user/login")public String login(@Req...
  • Springboot 拦截器、异常类和定时器相关基础 拦截器用于拦截controller中被访问的路径,false表示拦截 true代表放行。 拦截器的配置: package cn.zbw.interceptor; import org.springframework.lang.Nullable; ...
  • import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;impo...
  • 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章底部。1. 环境搭建IntelliJ IDEA + Java8 + Spring Boot + Tomcat我将之前项目...
  • 在用户登陆之后,我们一般会把用户登陆的状态和相关信息进行存储,把对应的token返回到客户端进行存储,下次...并且一些隐私信息持久化到redis也不合理,这时就需要统一对这种接口的请求做一起处理了。拦截器Hand...
  • 源码SpringBoot拦截器可以做什么可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等SpringBoot拦截器实现登录拦截pom.xml:xsi:schemaLocation=...4.0.0or...
  • JavaSpringBoot拦截器一般都可以做什么?可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。SpringBoot拦截器实现登录拦截pom.xml:<?xml version="1.0" encoding="UTF...
  • SpringBoot 拦截器获取http请求参数—— 所有骚操作基础目录SpringBoot 拦截器获取http请求参数—— 所有骚操作基础获取http请求参数是一种刚需定义拦截器获取请求为什么拦截器会重复调两遍呢?ServletInputStream...
  • Spring拦截器实现及请求链路说明1.拦截器与过滤器的区别1.1 JavaWeb三大组件“ javaWeb有三大组件,分别是:servlet,Filter,Listener1.1.1 Servlet广义:Servlet是一个运行在web服务器或者应用服务器上的一个应用...
  • 首先,你的项目要能跑起来,且基于springboot的boot的拦截器不用配置web.xml,按照特定名字书写(后缀+注解),它会自动识别(位置随便放,只要在代码目录下就可以)1.拦截器 SessionInterceptor.javapackage ...
  • 可能还需要获取自定义的配置以及添加过滤器和拦截器。至于为什么将这些写在一起,只是因为这些比较简单而且也会经常用到,所以干脆就一起写出来了。读取配置文件在使用maven项目中,配置文件会放在resources根目录下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 760
精华内容 304
关键字:

java拦截器springboot

java 订阅
spring 订阅