SpringBoot中使用Servlet3.0注解开发自定义的拦截器
使用Servlet3.0的注解进行配置步骤
- 启动类里面加@ServletComponentScan,进行扫描
- 新建一个Filter类,implements Filter,并实现对应的接口
- @WebFilter标记一个类为filter,被spring扫描
- urlPatterns:拦截规则,支持正则
- 控制chain.doFilter的方法调用,来实现是否通过放行
- 不放行,web应用resp.sendRedirect("/index.html")或者返回json字符串
场景
权限控制、用户登陆状态控制,也可以交给拦截器处理等
实现
项目结构
VideoOrderController.java
package net.cyb.demo.controller; import net.cyb.demo.utils.JsonData;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/api/v1/pri/order")
public class VideoOrderController {
@RequestMapping("save")
public JsonData saveOrder(){
return JsonData.buildSuccess("下单成功");
}
}
User.java
package net.cyb.demo.domain; public class User {
private int id;
private String username;
private String pwd;
public User(){}
public User(int id,String username,String pwd){
this.id=id;
this.username=username;
this.pwd=pwd;
}
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
LoginFilter.java(拦截规则)
package net.cyb.demo.filter; import net.cyb.demo.domain.User;
import net.cyb.demo.service.UserService;
import net.cyb.demo.service.impl.UserServiceImpl;
import org.thymeleaf.util.StringUtils; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebFilter(urlPatterns = "/api/v1/pri/*", filterName = "LoginFilter")
public class LoginFilter implements Filter {
/**
* 容器加载的时候
*
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init LoginFilter============");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter LoginFilter============");
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String token = req.getHeader("token");
if (StringUtils.isEmpty(token)) {
token = req.getParameter("token");
}
if (StringUtils.isEmpty(token)) {
return;
} else {
//判断token是否合法 TODO
User user = UserServiceImpl.sessionMap.get(token);
if (user != null) {
filterChain.doFilter(servletRequest, servletResponse);
}
}
} /**
* 容器销毁的时候
*/
@Override
public void destroy() {
System.out.println("destroy LoginFilter========");
}
}
方式二
package net.cyb.demo.filter; import com.fasterxml.jackson.databind.ObjectMapper;
import net.cyb.demo.domain.User;
import net.cyb.demo.service.UserService;
import net.cyb.demo.service.impl.UserServiceImpl;
import net.cyb.demo.utils.JsonData;
import org.thymeleaf.util.StringUtils; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebFilter(urlPatterns = "/api/v1/pri/*", filterName = "LoginFilter")
public class LoginFilter implements Filter {
private static final ObjectMapper objectMapper=new ObjectMapper();
/**
* 容器加载的时候
*
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init LoginFilter============");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter LoginFilter============");
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String token = req.getHeader("token");
if (StringUtils.isEmpty(token)) {
token = req.getParameter("token");
}
if (StringUtils.isEmpty(token)) {
JsonData jsonData=JsonData.buildError(-3,"未登陆");
String jsonStr=objectMapper.writeValueAsString(jsonData);
renderJson(resp, jsonStr);
} else {
//判断token是否合法 TODO
User user = UserServiceImpl.sessionMap.get(token);
if (user != null) {
filterChain.doFilter(servletRequest, servletResponse);
}else {
JsonData jsonData=JsonData.buildError(-2,"登陆失败,token无效");
String jsonStr=objectMapper.writeValueAsString(jsonData);
renderJson(resp, jsonStr);
}
}
} private void renderJson(HttpServletResponse response,String json){
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
try{
PrintWriter writer=response.getWriter();
writer.print(json);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 容器销毁的时候
*/
@Override
public void destroy() {
System.out.println("destroy LoginFilter========");
}
}
UserMapper.java
package net.cyb.demo.mapper; import net.cyb.demo.domain.User;
import org.springframework.stereotype.Repository; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Repository
public class UserMapper {
private static Map<String, User> userMap = new HashMap<>();
static {
userMap.put("alex",new User(1,"alex","123"));
userMap.put("sa",new User(2,"sa","123"));
userMap.put("cyb",new User(3,"cyb","123"));
}
public User login(String username,String pwd){
User user=userMap.get(username);
if (user==null)return null;
if (user.getPwd().equalsIgnoreCase(pwd))
return user;
return null;
}
public List<User> listUser(){
List<User> list=new ArrayList<>();
list.addAll(userMap.values());
return list;
}
}
UserServiceImpl.java
package net.cyb.demo.service.impl; import net.cyb.demo.domain.User;
import net.cyb.demo.mapper.UserMapper;
import net.cyb.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID; @Service
public class UserServiceImpl implements UserService {
public static Map<String, User> sessionMap = new HashMap<>();
@Autowired
private UserMapper userMapper; @Override
public String login(String username, String pwd) {
User user = userMapper.login(username, pwd);
if (user == null) {
return null;
} else {
String token = UUID.randomUUID().toString();
System.out.println(token);
sessionMap.put(token, user);
return token;
}
} @Override
public List<User> listUser() {
return userMapper.listUser();
}
}
DemoProject1Application.java(启动类)
package net.cyb.demo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan
public class DemoProject1Application { public static void main(String[] args) { SpringApplication.run(DemoProject1Application.class, args);
}
}
测试
SpringBoot中使用Servlet3.0注解开发自定义的拦截器的更多相关文章
- 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强
l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { ...
- springboot中@EnableAsync与@Async注解使用
springboot中@EnableAsync与@Async注解使用 @Async为异步注解,放到方法上,表示调用该方法的线程与此方法异步执行,需要配合@EnableAsync注解使用. 1.首先演示 ...
- 6.28笔记-servlet3.0注解配置、文件上传、过滤器、监听器
一.servlet3.0注解配置 使用javaEE6.0 支持servlet3.0 value的值就是访问路径 urlPatterns的值也是访问路径 @WebServlet(name="D ...
- 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...
- SpringBoot | 第七章:过滤器、监听器、拦截器
前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏高词汇.访问权限控制(URL级别)等业务需求.这些对于业务来说一般上是无关的,业务方是无需关系的,业务只需 ...
- SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)
SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...
- springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- Dubbo自定义日志拦截器
前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
随机推荐
- 超详细!深入分析PPTP虚拟专用网搭建与抓包
PPTP虚拟专用网搭建与抓包分析实验 实验目的:掌握PPP协议VPN的搭建,通过分析pptp建立,理解chap连接建立的过程 实验过程: 环境搭建 Windows 11系统 VMware虚拟机.kal ...
- text/event-stream协议
客户端接收 text/event-stream html <!DOCTYPE html> <html> <head> <meta charset=" ...
- Hugging Face ZeroGPU 计划正式发布—提供价值一千万美元的免费共享 GPU
在人工智能技术领域,GPU 资源一直是推动研究和应用的关键因素.然而,GPU 的成本和可用性对于许多研究人员和开发者来说却是一个显著的障碍. 在 Hugging Face,我们希望人工智能技术可以更加 ...
- 【题解】A566.三点共线
题目大意,给定在平面直角坐标系中的多个点,判断有多少个三元组 \((A, B, C)\) 满足共线性质. 题目链接:A566.三点共线. 大题思路就是暴力所有的三元组,判断三个元素的斜率是否相同即可. ...
- C# 借助NPOI 完成 xls 转换为xlsx
背景:MinExcel开源类库,导数据的库,占用内存很低,通过io,不通过内存保存,不支持 xls格式的文件,支持csv和xlsx,所以要想使用这个库,就得把xls格式转换为xlsx.只复制了数据 合 ...
- 虚拟机ping不通物理机 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
准备做samba服务配置的时候 ping 192.168.10.1 (物理机地址) PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 查看自 ...
- tab切换之循环遍历
<style> *{ margin: 0; padding:0; } ul,ol,li{ ...
- chrome edge CORS 允许跨域
edge: edge://flags/#block-insecure-private-network-requests chrome: 在谷歌浏览器地址栏输入"chrome://flags/ ...
- 微信实名认证申请单报错:请求中含有未在API文档中定义的参数
完整错误: {"code":"PARAM_ERROR","detail":{"location":null," ...
- Grafana 开源了一款 eBPF 采集器 Beyla
eBPF 的发展如火如荼,在可观测性领域大放异彩,Grafana 近期也发布了一款 eBPF 采集器,可以采集服务的 RED 指标,本文做一个尝鲜介绍,让读者有个大概了解. eBPF 基础介绍可以参考 ...