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中
Spring boot自定义拦截器和拦截器重定向配置简单介绍的更多相关文章
- Spring Boot干货:静态资源和拦截器处理
前言 本章我们来介绍下SpringBoot对静态资源的支持以及很重要的一个类WebMvcConfigurerAdapter. 正文 前面章节我们也有简单介绍过SpringBoot中对静态资源的默认支持 ...
- Spring Boot项目中如何定制拦截器
本文首发于个人网站:Spring Boot项目中如何定制拦截器 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供Han ...
- spring拦截器不拦截方法名原因
开发一个基于注解的登录拦截器,遇到拦截器只能拦截controller不能拦截到具体的方法名,这样拦截器就完全没用,经过仔细摸索,DefaultAnnotationHandlerMapping和Anno ...
- Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置
0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...
- SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?
往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...
- struts2拦截器interceptor的三种配置方法
1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...
- Struts2-整理笔记(五)拦截器、拦截器配置
拦截器(Interceptor) 拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 拦截器的优点 简化了Action的实现 ...
- SpringMCVC拦截器不拦截静态资源
SpringMCVC拦截器不拦截静态资源 SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下 ...
- Spring Boot自定义Redis缓存配置,保存value格式JSON字符串
Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...
随机推荐
- hdu 1402 A * B Problem Plus (FFT模板)
A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...
- POJ 1321 棋盘问题(dfs入门)
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- CodeForces 731D (差分+线段扫描)
Description Archeologists have found a secret pass in the dungeon of one of the pyramids of Cyclelan ...
- 对象关系型数据库管理系统(PostgresQL )
PostgresQL是 对象关系型数据库管理系统(ORDBMS).PostgreSQL支持大部分SQL标准并且提供了许多其他现代特性:复杂查询.外键.触发器.视图.事务完整性.MVCC.同样,Po ...
- BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...
- CCPC-Wannafly 秦皇岛 day5训练总结
训练总结 今天开局先上去看到了J,粗略(>_<)的看了下题意,然后就觉得应该是个dp 就开始写,思路是个三维dp,开的10000*10*10 觉得就不会爆,时间上也没问题,后面陆续wa了 ...
- Branch policies on Azure Repos
https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-policies-overview?view=azure-devops B ...
- 个人笔记 - MATLAB
1.教程 2.基本知识 2.1 帮助文档设置成中文:链接1 2.2 多行注释: 链接1 2.3 MATLAB基本数据类型: 链接1 链接2 2.4 matlab中的 ndims(a).length( ...
- MySQL高级学习笔记(二):mysql配置文件、mysql的用户与权限管理、mysql的一些杂项配置
文章目录 mysql配置文件 二进制日志log-bin 错误日志log-error 数据文件 两系统 Myisam存放方式 innodb存放方式 如何配置 mysql的用户与权限管理 MySQL的用户 ...
- 硬RAID与软RAID的区别
什么是RAID? RAID是英文Redundant Array of Independent Disks的缩写,翻译成中文即为独立磁盘冗余阵列,或简称磁盘阵列.简单的说,RAID是一种把多块独立的硬盘 ...