常用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 + 过滤器的更多相关文章

  1. 【spring-boot神器】第一篇:拦截器,过滤器,监听器,控制器,消息转换器,AOP执行顺序

    整理一下这几天学习的资料和代码 第一部分.上代码 1.spring各种器的实现,idea搭建spring-boot的教程在这里http://www.jianshu.com/p/9082a533fa3c ...

  2. SpringBoot使用拦截器、过滤器、监听器

    目录 ## 过滤器 PS: 原文链接https://www.cnblogs.com/haixiang/p/12000685.html,转载请注明出处 过滤器简介 过滤器的使用 拦截器 拦截器介绍 使用 ...

  3. java web 拦截器、过滤器理解

    1.首先要明确什么是拦截器.什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加 ...

  4. 【java web】拦截器inteceptor

    一.简介 java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性. Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现 ...

  5. Sturts2几个常用内建拦截器的介绍

    Sturts2几个常用内建拦截器的介绍:1)conversation:这是一个处理类型转换错误的拦截器,它负责将类型转换错误从ActionContext中取出,并转换成Action的FieldErro ...

  6. SpringBoot学习笔记:自定义拦截器

    SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...

  7. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  8. java 拦截器、过滤器、监听器

    一.理解Struts2拦截器 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...

  9. SpringMVC中的拦截器、过滤器的区别、处理异常

    1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...

随机推荐

  1. Flume 组件安装配置

    下载和解压 Flume 实验环境可能需要回至第四,五,六章(hadoop和hive),否则后面传输数据可能报错(猜测)! 可 以 从 官 网 下 载 Flume 组 件 安 装 包 , 下 载 地 址 ...

  2. HBase集群部署与基础命令

    HBase 集群部署 安装 hbase 之前需要先搭建好 hadoop 集群和 zookeeper 集群.hadoop 集群搭建可以参考:https://www.cnblogs.com/javammc ...

  3. 利用userfaultfd + setxattr堆占位

    利用userfaultfd + setxattr堆占位 很久之前便看到过这个技术的名字,但是由于自己的摆烂,一直没有管.今天终于找到时间好好看一下这个技术的利用方式.利用userfaultfd + s ...

  4. KingbaseES sys_blocking_pids 函数

    会话出现了锁等待,想要快速查询到堵塞的会话,可以使用 sys_blocking_pids 函数来实现这一目的. sys_blocking_pids:获取哪些会话阻塞了某个会话(输入参数). sys_b ...

  5. KDB_Database_Link 使用介绍

    kdb_database_link 是 KingbaseES 为了兼容oracle 语法而开发的跨数据库访问扩展,可用于访问KingbaseES, Postgresql , Oracle .以下分别介 ...

  6. Kubernetes 监控--Grafana

    前面我们使用 Prometheus 采集了 Kubernetes 集群中的一些监控数据指标,我们也尝试使用 promQL 语句查询出了一些数据,并且在 Prometheus 的 Dashboard 中 ...

  7. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

  8. filebeat直接给es传输日志,自定义索引名

    ElasticStack从2019年1月29日的6.6.0版本的开始,引入了索引生命周期管理的功能,新版本的Filebeat则默认的配置开启了ILM,导致索引的命名规则被ILM策略控制. 加上这个配置 ...

  9. PostgreSQL 选择数据库

    数据库的命令窗口 PostgreSQL 命令窗口中,我们可以命令提示符后面输入 SQL 语句: postgres=# 使用 \l 用于查看已经存在的数据库: postgres=# \l List of ...

  10. 5G 与数字化转型的关系是怎样的?

    5G提供的是通信网络服务,数字化转型需要网络服务,但并不是必须使用5G网络,也就是说5G在数字化转型中并不是必虚的,但可以作为备选项,不过在某些行业比如农业.林业.牧业.港口.建筑等布设有线网络.无线 ...