Spring boot 自定义处理404 500等

Spring boot 自定义处理404 500等 有时候我们会遇到一些问题,需要我们自定义一些异常,例如404、403、502、500等,我们这里就说说Springboot 修改自定义这些。 处理方式一 我们重写ErrorController接口,重写handleError方法 `import javax.servlet.http.HttpServletRequest; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MainsiteErrorController implements ErrorController{ @RequestMapping("/error") public ModelAndView handleError(HttpServletRequest request,HttpServletResponse response){ //获取statusCode:401,404,500 //Integer statusCode = (Integer) request.getAttribute(“javax.servlet.error.status_code”); Integer statusCode =response.getStatus(); ModelAndView model = new ModelAndView(); if(statusCode == 401){ model.setViewName(“401.html”); }else if(statusCode == 404){ model.setViewName(“404.html”); }else if(statusCode == 403){ model.setViewName(“403.html”); }else{ model.setViewName(“500.html”); } return model; } @Override public String getErrorPath() { return “/error”; } ...

2020年8月12日 · 2 分钟 · 天边的星星

Spring boot 集成ElasticSearch

Spring boot 集成ElasticSearch * [第一步Spring boot集成ELasticSearch][2] * [第二步Spring boot中配置ElasticSearch][3] * [第三步 创建操作的实体Bean(我创建的是UserItemBean)][4] * [第四步 使用ElasticSearch的API进行测试][5] Spring boot 集成ElasticSearch 第一步Spring boot集成ELasticSearch `<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.junit.vintage&lt;/groupId&gt; &lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt; &lt;/exclusion&gt; &lt;/exclusions&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;fastjson&lt;/artifactId&gt; &lt;version&gt;1.2.68&lt;/version&gt; &lt;/dependency&gt; </dependencies> ` > > Spring boot集成ElasticSearch主要依赖 > > ``` `spring-boot-starter-data-elasticsearch ` 这里需要大家特别注意自己使用的ElasticSearch的版本 是否和自己的版本一致 我这里是使用的最新的ElasticSearch 7.8.0 需要配置版本 &lt;properties&gt; &lt;java.version&gt;1.8&lt;/java.version&gt; &lt;elasticsearch.version&gt;7.8.0&lt;/elasticsearch.version&gt; &lt;/properties&gt; ### 第二步Spring boot中配置ElasticSearch {#toc_2} > 创建一个<mark>ElasticSearchConfig</mark>的类,配置在下ElasticSearch的高级客户端api > > ``` `import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Elasticsearch 配置 */ @Configuration public class ElasticSearchConfig { @Bean public RestHighLevelClient restHighLevelClient(){//配置rest客户端 RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("192.168.1.187", 9200, "http"))); return client; } } ` 注意:这里可以配置多个ElasticSearch 只需要创建多个HttpPost即可 ...

2020年6月28日 · 4 分钟 · 天边的星星

springBoot基于thymeleaf集成H-ui后台

对于H-ui的体验与下载,大家可以直接访问他的官方网站:http://www.h-ui.net/H-ui.admin.shtml。 第一步下载H-UI admin 第二步 在Springboot 项目中的 static、templates 目录下面创建 admin文件夹 如下图 注意 把H-ui.admin所使用到的静态资源放到 static/admin下 第三步 配置controller ` import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping("/admin/index") public class MainController { //日志 private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired SysDictService sysDictService;//字典服务 @Autowired PjBankService pjBankService;//银行列表服务 /** * * @return */ @RequestMapping("/index") public String index(){ logger.info("后台首页"); return "/admin/index"; } /** * * @return */ @RequestMapping("/articlelist") public String articleList(){ logger.info("文字列表界面"); return "/admin/articlelist"; } /** * * @return */ @RequestMapping("/adminrole") public String adminrole(){ logger.info("角色管理"); return "/admin/admin-role"; } /** * * @return */ @RequestMapping("/admin-permission") public String adminpermission(){ logger.info("权限管理"); return "/admin/admin-permission"; } /** * * @return */ @RequestMapping("/admin-list") public String adminlist(){ logger.info("管理员管理"); return "/admin/admin-list"; } /** * * @return */ @RequestMapping("/member-list") public String memberlist(){ logger.info("管理员管理"); return "/admin/member-list"; } /** * * @return */ @RequestMapping("/admin-role-add") public String adminRoleAdd(){ logger.info("管理员管理"); return "/admin/admin-role-add"; } /** * * @return */ @RequestMapping(value = "/login",method = {RequestMethod.GET}) public String login(Model model){ logger.info("登录界面"); model.addAttribute("errorMsg",""); return "/admin/login"; } /** * * @return */ @PostMapping("/login") public String loginPost(Model model,HttpServletRequest request, HttpServletResponse response){ logger.info("登录用户名,密码验证"); String username = request.getParameter("username"); String password = request.getParameter("password"); String yzm = request.getParameter("yzmcode"); String pwd = new String(Base64.decodeBase64(password)); logger.info(username); logger.info(password); logger.info(pwd); logger.info(yzm); logger.info("session yzm=>"+request.getSession().getAttribute(VerifyUtil.RANDOMCODEKEY)); if (username.equals("zhangdl")&&pwd.equals("123456")){ return "redirect:/admin/index/welcome"; }else{ model.addAttribute("errorMsg","登录失败,用户名密码错误!"); return "/admin/login"; } } //创建方法 @RequestMapping("/welcome") public String welcome(){ logger.info("欢迎页"); return "/admin/welcome"; } /** * @desc 图形验证码生成 */ @RequestMapping("/createImg") public void createImg(HttpServletRequest request, HttpServletResponse response) throws Exception { try { response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片 response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容 response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); VerifyUtil randomValidateCode = new VerifyUtil(); randomValidateCode.getRandCode(request, response);//输出验证码图片 }catch (Exception e){ logger.error("获取验证码失败!"); } } } ` 这个时候,基本上就集成完成。但是如果项目配置 server.servlet.context-path=/abc 这个时候,我们在开发的过程中 会出现路径问题。这个时候需要我们配置 界面中静态资源路径 ...

2020年5月29日 · 4 分钟 · 天边的星星

SpringBoot Controller接收参数的几种常用方式

 第一类:请求路径参数 1、@PathVariable 获取路径参数。即url/{id}这种形式。 2、@RequestParam 获取查询参数。即url?name=这种形式 例子 GET http://localhost:8080/demo/123?name=suki_rong 对应的java代码: @GetMapping("/demo/{id}") public void demo(@PathVariable(name = "id") String id, @RequestParam(name = "name") String name) { System.out.println("id="+id); System.out.println("name="+name); } 输出结果: id=123 name=suki_rong 第二类:Body参数 因为是POST请求,这里用Postman的截图结合代码说明 1、@RequestBody 例子: 对应的java代码: @PostMapping(path = "/demo1") public void demo1(@RequestBody Person person) { System.out.println(person.toString()); } 输出结果: name:suki_rong;age=18;hobby:programing 也可以是这样 @PostMapping(path = "/demo1") public void demo1(@RequestBody Map&lt;String, String&gt; person) { System.out.println(person.get("name")); } 输出结果: suki_rong ...

2019年12月15日 · 3 分钟 · 天边的星星

Spring boot+mybatis+Sqlite环境配置

Spring boot+mybatis+Sqlite+mybatis-generator环境配置 有的时候 我们开发不需要一定要用到mysql、oracle等数据库,Sqlite也是我们的一种选择。 Sqlite使用场景 小型网站 SQLite适用于中小规模流量的网站. 日访问在10万以下的网站可以很好的支持,适用于读多写少的操作,如管理员在后台添加数据,其他访客多为浏览. 10万/天是一个临界值,事实上在100万的数据量之下,SQLite的表现还是可以的,在往上就不适合了. 使用它无需单独购买数据库服务,无需服务器进程,配置成本几乎为零,加上数据的导入导出都是复制文件,维护难度也几乎为零,迁移到别的服务器无需任何配置即可支持,加上其读取的速度非常快,省去了远程数据库的链接,能够极大提升网站访问速度. 嵌入式设备 SQLite适用于手机, PDA, 机顶盒, 以及其他嵌入式设备. 作为一个嵌入式数据库它也能够很好的应用于客户端程序. 因为其轻量,小巧,不怎么占用内存,数据的读写性能好,加上嵌入式设备数据量并不大,不需要频繁的维护,所以比较适合. 数据库教学 SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。 其无配置,无依赖,小巧,单一文件的特性让它的安装和使用非常简单,非常适合用来讲解SQL语句. 学生可以在很短的时候使用并操作SQLite,不受系统和商业限制等影响,学习的结果可以通过邮件或者云文件等形式发送给老师进行评分. 可以通过它快速实现一个最小化应用,适合学生快速了解SQLite,以及SQL语法,从而实现数据库的触类旁通,了解其他数据库系统的设计实现原则. 本地应用程序 其单一磁盘文件的特性,并且不支持远程连接,使其适用于本地的应用程序,如PC客户端软件. 常用的应用类型为金融分析工具、CAD 包、档案管理程序等等. (手机上的通讯录也是用此开发的) 没有远程,意味着适用于内部或者临时的数据库,用来处理一些数据,让程序更加灵活. 不适用场景 很明显其适合小型网站,相对的就不适合高流量网站.,也不适合超大的数据集,在其缺点也提到,不适合高并发访问. POM.xm配置 `<?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 https://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.2.1.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <groupId>com.zdltech.test</groupId> <artifactId>sqlitetest</artifactId> <version>0.0.1-SNAPSHOT</version> <name>sqlitetest</name> <description>Demo project for Spring Boot</description> &lt;properties&gt; &lt;java.version&gt;1.8&lt;/java.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-jdbc&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt; &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt; &lt;version&gt;2.1.1&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;exclusions&gt; &lt;exclusion&gt; &lt;groupId&gt;org.junit.vintage&lt;/groupId&gt; &lt;artifactId&gt;junit-vintage-engine&lt;/artifactId&gt; &lt;/exclusion&gt; &lt;/exclusions&gt; &lt;/dependency&gt; &lt;!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc --&gt; &lt;dependency&gt; &lt;groupId&gt;org.xerial&lt;/groupId&gt; &lt;artifactId&gt;sqlite-jdbc&lt;/artifactId&gt; &lt;version&gt;3.28.0&lt;/version&gt; &lt;/dependency&gt; &lt;!-- druid--&gt; &lt;dependency&gt; &lt;groupId&gt;com.alibaba&lt;/groupId&gt; &lt;artifactId&gt;druid&lt;/artifactId&gt; &lt;version&gt;1.1.14&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;/plugin&gt; &lt;plugin&gt; &lt;groupId&gt;org.mybatis.generator&lt;/groupId&gt; &lt;artifactId&gt;mybatis-generator-maven-plugin&lt;/artifactId&gt; &lt;version&gt;1.3.7&lt;/version&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; </project> ` ...

2019年11月28日 · 2 分钟 · 天边的星星

一步一步带你构建Spring Cloud

​ Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 Spring Cloud Netflix 是对Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。 Spring Cloud Config 将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件 Spring Cloud Bus 分布式消息队列,是对Kafka, MQ的封装 Spring Cloud Security 对Spring Security的封装,并能配合Netflix使用 Spring Cloud Zookeeper 对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用 Spring Cloud Eureka Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能 ​ Spring cloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合。 本章Spring cloud 使用,一步一步带你构建Spring cloud整个应用 构建Spring cloud服务端 构建Spring cloud 服务提供端 构建Spring cloud 消费端(服务调用端) 一、Spring Cloud 服务端 POM.xml 配置 `<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.1.6.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <groupId>com.test.cloud</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> ...

2019年8月27日 · 5 分钟 · 天边的星星

Spring boot 读取properties

## Spring boot 读取properties 在开发中我们需要通过属性文件配置常用属性,例如数据库相关、日志相关、测试相关等。 自定义properties文件获取属性 application.properties获取属性 ### 自定义properties文件获取属性 使用@configurationProperties((prefix=”xxx.yyy”)) 和 @PropertySource(“classpath:xxxconfig.properties”) xxx.yyy表示的是属性文件中的前缀(有时候我们希望可以分的更清楚) 使用自定义的时候需要给类添加@Component 让Spring管理类的生命周期 在使用的地方使用@Autowired 让系统进行初始化 // PropertySource默认取application.properties // @PropertySource(value = “xxxconfig.properties”) 例如 “` @Component @ConfigurationProperties(prefix = “com.xxx”) @PropertySource(“classpath:myconfig.properties”) public class TestBean { private String host; public String getHost() { return host; } public void setHost(String host) { this.host = host; } } //使用地方 @Autowired private TestBean testBean “` ### application.properties获取属性 共有三种 参考上面自定义 只是不用设置PropertySource PropertySource默认取application.properties 使用@Value注解 使用Environment #### 使用@Value ...

2019年7月11日 · 2 分钟 · 天边的星星

Spring boot 事务回滚

在Controller中添加 @Transactional 自己捕获异常之后事务不能回滚 原因: 默认spring事务只在发生未被捕获的 RuntimeException 时才回滚 spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获 RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚 换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚 解决方案 例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在service上层(webservice客户端,view层action)要继续捕获这个异常并处理 在controller层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常 例如 try{ *//出现异常* } catch (Exception e){ e.printStackTrace(); //设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }

2019年6月20日 · 1 分钟 · 天边的星星

Spring boot过滤器 Filter使用

过滤器Filter ** 过滤器是基于Servlet的拦截,是在Web容器进行拦截。常用的场景有登录、权限判断、tonken过滤等。当然使用拦截器也可以,拦截器是基于Spring的拦截,可以作用于Controller等的方法中。如果是Web的话,没有特别要求,还是使用过滤器吧(本人观点) 编写过滤器 新建过滤器 需要实现javax.servlet.Filter接口,并重新其中的方法 public class LoginFilter implements Filter { ` @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { } @Override public void destroy() { } }` HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; 可以转换为我们平时使用的HttpServletRequest 和 HttpServletResponse 如果不需要过滤 直接调用 filterChain.doFilter(servletRequest, servletResponse); 如果需要过滤 根据自己的业务处理 例如:判断token、ip等,直接通过HttpServletResponse 返回异常处理 重定向跳转 response.sendRedirect(request.getContextPath()+&#8221;/*.html&#8221;); 界面返回response.getWriter().write(this.NO_LOGIN); String requestType = request.getHeader(&#8220;X-Requested-With&#8221;); //判断是否是ajax请求 if(requestType!=null && &#8220;XMLHttpRequest&#8221;.equals(requestType)) 过滤器配置 配置方式有2中,一种是通过注解,一种是通过过滤器配置 一、注解方式配置 在过滤器上添加WebFilter注解 ...

2019年6月14日 · 1 分钟 · 天边的星星

Spring Boot 过滤器和拦截器总结

![请输入图片描述][1]### 拦截器与过滤器的区别 过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。 SpringMVC的机制是由DispaterServlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的. 过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。 ** 过滤器就是过滤的作用,在web开发中过滤一些我们指定的url 那么它能帮我们过滤什么呢? 那功能可就多了: 比如过拦截掉我们不需要的接口请求 修改请求(request)和响应(response)内容 完成CORS跨域请求等等 最简单明了的区别就是 <strong>过滤器可以修改request,而拦截器不能过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境拦截器可以调用IOC容器中的各种依赖,而过滤器不能过滤器只能在请求的前后使用,而拦截器可以详细到每个方法** 过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程 何时使用拦截器?何时使用过滤器? 如果是非spring项目,那么拦截器不能用,只能使用过滤器。 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。 如果是处理dispaterServlet前后,只能使用过滤器。 过滤器:它依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等 拦截器:它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是直接访问静态资源的请求则没办法进行拦截处理。 两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。 Spring boot使用过滤器 使用spring boot提供的FilterRegistrationBean注册Filter 使用原生servlet注解定义Filter 两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter 方式一 先定义Filter ` import javax.servlet.*; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 处理request 或response System.out.println("filter1"); // 调用filter链中的下一个filter filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` 注册自定义Filter `@Configuration public class FilterConfig { @Bean public FilterRegistrationBean registrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }` 方式二 `@Component // 定义filterName 和过滤的url @WebFilter(filterName = "my2Filter" ,urlPatterns = "/*") public class My2Filter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filter2"); filterChain.doFilter(servletRequest,servletResponse); //如果过滤通过,执行filterChain.doFilter(servletRequest,servletResponse); 不通过就执行直接返回 } @Override public void destroy() { } }` Spring boot 拦截器的使用 定义拦截器: `public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true;////如果false,停止流程,api被拦截 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("afterCompletion"); } }` 配置拦截器: `@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()); } }` Controller演示: `@RestController public class UController { @GetMapping("/home") public String home(){ System.out.println("home"); return "myhome"; } } 输出: preHandle home postHandle afterCompletion`

2019年5月24日 · 2 分钟 · 天边的星星