SpringBoot 03: 常用web组件 - - - 拦截器 + Servlet + 过滤器
常用web组件
- 拦截器
- Servlet
- 过滤器
使用思想
- 创建自定义类
- 实现或者继承框架里的接口或类
- 将自定义类注册到框架中
- 使用自定义类
拦截器
说明
- 拦截器是SpringMVC中的一种对象,能拦截对Controller的请求
- 拦截器框架中有系统的拦截器,还可以自定义拦截器,实现对请求的预先处理
自定义拦截器
- 创建自定义的拦截器类实现SpringMVC框架的HandlerInterceptor接口,根据对拦截时机的需求,重写接口里的对应方法
package com.example.web.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//实际应用中被拦截的请求在这里执行其他逻辑判断,是否放行由判断结果来定
System.out.println("LoginInterceptor拦截器的preHandle方法执行");
return true;
}
}
- 注册拦截器
package com.example.web.config;
import com.example.web.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建一个拦截器对象
LoginInterceptor loginInterceptor = new LoginInterceptor();
//需要拦截的url
String[] interceptorUrl = {"/user/**"};
//需要放行的url
String[] excludeUrl = {"/user/login"};
registry.addInterceptor(loginInterceptor)
.addPathPatterns(interceptorUrl)
.excludePathPatterns(excludeUrl);
}
}
- Controller层
package com.example.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class InterceptorTest {
@RequestMapping("/user/account")
@ResponseBody
public String account(){
return "访问账户页面";
}
@RequestMapping("/user/login")
@ResponseBody
public String login(){
return "访问用户登录页面";
}
}
Servlet
- 创建Servlet类,继承HttpServlet
package com.example.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应类型
resp.setContentType("text/html;charset=utf-8");
//获取输出流对象
PrintWriter out = resp.getWriter();
//向浏览器输出数据
out.println("--- springboot的servlet被调用 ---");
out.flush();
out.close();
}
}
- 注册Servlet, 让框架能找到Servlet
package com.example.web.config;
import com.example.web.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyWebConfig {
//调用方法,注册servlet
// @Bean
// public ServletRegistrationBean servletRegistrationBean(){
// return new ServletRegistrationBean(new MyServlet(), "/servlet.do");
// }
//注册servlet的方式2
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new MyServlet());
servletRegistrationBean.addUrlMappings("/servlet1.do", "/servlet2.do");
return servletRegistrationBean;
}
}
过滤器
说明
- Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数,属性进行调整。常常在过滤器中处理字符编码
使用自定义过滤器
- 创建自定义过滤器类
package com.example.web.filter;
import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("MyFilter的doFilter方法被调用");
filterChain.doFilter(servletRequest, servletResponse);
}
}
- 注册Filter过滤器对象
package com.example.web.config;
import com.example.web.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyFilterConfig {
//定义方法,注册过滤器
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.addUrlPatterns("/user/*");
return filterRegistrationBean;
}
}
使用自定义字符集过滤器
- 创建servlet
package com.example.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应类型
resp.setContentType("text/html");
//获取输出流对象
PrintWriter out = resp.getWriter();
out.println("使用springboot字符过滤器");
out.flush();
out.close();
}
}
- 注册servlet和配置字符集过滤器
package com.example.web.config;
import com.example.web.servlet.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
@Configuration
public class MyWebConfig {
//注册servlet
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new MyServlet());
servletRegistrationBean.addUrlMappings("/test");
return servletRegistrationBean;
}
//注册内置的字符过滤器
@Bean
public FilterRegistrationBean filterRegistrationBean(){
//内置的字符过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
//按需求定制字符过滤器
characterEncodingFilter.setEncoding("utf-8");
characterEncodingFilter.setForceEncoding(true);
//注册按照个性化需求配置后的字符过滤器
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(characterEncodingFilter);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
- 修改application.properties文件,让自定义的过滤器起作用
#关闭springboot框架默认的字符编码格式:ISO-8859-1
server.servlet.encoding.enabled=false
使用框架内置的字符集过滤器
- 创建servlet
package com.example.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应类型
resp.setContentType("text/html");
//获取输出流对象
PrintWriter out = resp.getWriter();
out.println("**** 使用springboot字符过滤器 ****");
out.flush();
out.close();
}
}
- 注册servlet
package com.example.web.config;
import com.example.web.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyWebConfig {
//注册servlet
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new MyServlet());
servletRegistrationBean.addUrlMappings("/test");
return servletRegistrationBean;
}
}
- 修改application.properties文件,让框架内置的字符集过滤器实现个性化定制
#让springboot默认的字符过滤器生效
server.servlet.encoding.enabled=true
#将默认的字符过滤器的编码格式设置为utf-8
server.servlet.encoding.charset=utf-8
#将请求和响应的编码格式都按照字符过滤器中的编码格式来进行解析
server.servlet.encoding.force=true
SpringBoot 03: 常用web组件 - - - 拦截器 + Servlet + 过滤器的更多相关文章
- 【spring-boot神器】第一篇:拦截器,过滤器,监听器,控制器,消息转换器,AOP执行顺序
整理一下这几天学习的资料和代码 第一部分.上代码 1.spring各种器的实现,idea搭建spring-boot的教程在这里http://www.jianshu.com/p/9082a533fa3c ...
- SpringBoot使用拦截器、过滤器、监听器
目录 ## 过滤器 PS: 原文链接https://www.cnblogs.com/haixiang/p/12000685.html,转载请注明出处 过滤器简介 过滤器的使用 拦截器 拦截器介绍 使用 ...
- java web 拦截器、过滤器理解
1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...
- 【java web】拦截器inteceptor
一.简介 java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性. Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现 ...
- Sturts2几个常用内建拦截器的介绍
Sturts2几个常用内建拦截器的介绍:1)conversation:这是一个处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldErro ...
- SpringBoot学习笔记:自定义拦截器
SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- java 拦截器、过滤器、监听器
一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...
- SpringMVC中的拦截器、过滤器的区别、处理异常
1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...
随机推荐
- SSH免密登录的配置
ssh登录 登录ssh一般情况有两种方法 密码登录 秘钥登录(免密) 大部分情况我们选择都是输入密码登录,平常使用暂时没有遇到什么问题.最近我编写了一些使用scp来传输文件的脚本,每一次scp都需要输 ...
- Java方法总结
什么是方法 何谓方法 就是一个方法只完成一个功能,这样利于后期的扩展 例子: public static void main(String[] args) { System.out.printl ...
- vscode 快速注释和撤回快捷键
好家伙,天天忘,建议先练个十遍上手 1.快捷行注释 Ctrl + / 2.快捷块注释 Alt + Shift + A 3.撤回 Ctrl + Z 4.恢复撤回(撤回你的撤回) Ctrl + Shift ...
- An iOS zero-click radio proximity exploit odyssey
NOTE: This specific issue was fixed before the launch of Privacy-Preserving Contact Tracing in iOS 1 ...
- 仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16
Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右.其中还有一些保留关键字属于"锦上添花",什么叫锦上添 ...
- KingbaseES V8R3集群管理维护案例之---集群迁移单实例架构
案例说明: 在生产中,需要将KingbaseES V8R3集群转换为单实例架构,可以采用以下方式快速完成集群架构的迁移. 适用版本: KingbaseES V8R3 当前数据库版本: TEST=# s ...
- Java代码审计之不安全的Java代码
Java代码审计之不安全的Java代码 在打靶场的同时,需要想一下如果你是开发人员你会怎样去防御这种漏洞,而作为攻击方你又怎么去绕过开发人员的防御. 环境搭建 https://github.com ...
- C++ 左值引用与 const 关键字
左值引用是已定义的变量的别名,其主要用途是用作函数的形参,通过将左值引用变量用作参数,函数将使用原始数据,而不是副本.引用变量必须在声明时同时初始化,可将 const 关键字用于左值引用,如下所示: ...
- ProxySQL SQL 注入引擎
ProxySQL 2.0.9 引入了 libsqlinjection 作为识别可能的 SQL 注入攻击的机制. 启用 SQL 注入检测 要启用 SQL 注入检测,只需要启用变量 mysql-aut ...
- Elasticsearch准实时索引实现(数据写入到es分片并存储到文件中的过程)
溢写到文件系统缓存 当数据写入到ES分片时,会首先写入到内存中,然后通过内存的buffer生成一个segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘) ES中默认1秒,refr ...