大家好:

  本文简单介绍一下用于权限控制的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中

Spring boot自定义拦截器和拦截器重定向配置简单介绍的更多相关文章

  1. Spring Boot干货:静态资源和拦截器处理

    前言 本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter. 正文 前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持 ...

  2. Spring Boot项目中如何定制拦截器

    本文首发于个人网站:Spring Boot项目中如何定制拦截器 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供Han ...

  3. spring拦截器不拦截方法名原因

    开发一个基于注解的登录拦截器,遇到拦截器只能拦截controller不能拦截到具体的方法名,这样拦截器就完全没用,经过仔细摸索,DefaultAnnotationHandlerMapping和Anno ...

  4. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...

  5. SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  6. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  7. Struts2-整理笔记(五)拦截器、拦截器配置

    拦截器(Interceptor) 拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 拦截器的优点 简化了Action的实现 ...

  8. SpringMCVC拦截器不拦截静态资源

    SpringMCVC拦截器不拦截静态资源 SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下 ...

  9. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

随机推荐

  1. pycharm查找替换快捷键

    查找:CTRL + F 替换:CTRL + R 如果想删除,替换那一栏不填就可以了

  2. CodeForces 隐藏标签

    设置css 记录. 以防忘记.

  3. 【leetcode】654. Maximum Binary Tree

    题目如下: Given an integer array with no duplicates. A maximum tree building on this array is defined as ...

  4. 06-图2 Saving James Bond - Easy Version(25 分)

    This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...

  5. Android_开发片段(Part 1)

    1.maven环境配置时也跟java类似,进行我的电脑环境的设置,cmd查询:mvn -version 2.在新建AVD时,要注意AVD的版本(API),版本太低或者太高,经常不能运行项目或者在运行项 ...

  6. Google recaptcha在webform中的使用

    开源项目 https://github.com/tanveery/recaptcha-net   这个的NuGet下载量最高 https://github.com/PaulMiami/reCAPTCH ...

  7. PHP-版本问题

    PHP 5.3 以下版本 无法用下标直接取得函数返回的数组 eg: $val_0 = explode(',', $val)[0]//报错 #要改成: $exploded_val = explode(' ...

  8. Oracle Database的安装与卸载

    目录 目录 软件环境 Oracle Database 就业前景 安装Oracle Server RDBMS体系结构 卸载Oracle Serveer 软件环境 系统 Windows 8.1 软件 Or ...

  9. upc组队赛4 Go Latin

    Go Latin 题目描述 There are English words that you want to translate them into pseudo-Latin. To change a ...

  10. Android组件内核之间组件间通信方案(四)下篇

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍通信方案: [ViewModel 与 V ...