使用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注解开发自定义的拦截器的更多相关文章

  1. 十八、泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器基础加强

    l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { ...

  2. springboot中@EnableAsync与@Async注解使用

    springboot中@EnableAsync与@Async注解使用 @Async为异步注解,放到方法上,表示调用该方法的线程与此方法异步执行,需要配合@EnableAsync注解使用. 1.首先演示 ...

  3. 6.28笔记-servlet3.0注解配置、文件上传、过滤器、监听器

    一.servlet3.0注解配置 使用javaEE6.0 支持servlet3.0 value的值就是访问路径 urlPatterns的值也是访问路径 @WebServlet(name="D ...

  4. 在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制

    权限控制是每一个系统都应该有的一个功能,有些只需要简单控制一下就可以了,然而有些却需要进行更加深入和细致的权限控制,尤其是对于一些MIS类系统,基于方法的权限控制就更加重要了. 用反射和自定义注解来实 ...

  5. SpringBoot | 第七章:过滤器、监听器、拦截器

    前言 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏高词汇.访问权限控制(URL级别)等业务需求.这些对于业务来说一般上是无关的,业务方是无需关系的,业务只需 ...

  6. SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)

    SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...

  7. springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文都是springboot的常用和实用功能,话不多说开始吧 定时任务 1.启动类开启注解 @EnableScheduling //开启基于注解 ...

  8. Mybatis自定义SQL拦截器

    本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...

  9. Dubbo自定义日志拦截器

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  10. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

随机推荐

  1. typescript基础知识汇总

    JavaScript中所有事物(字符串.数值.数组.函数)都是对象,都有属性和方法.1.用函数定义对象,然后new对象实例.2.用Object定义并创建对象实例var o = new Object(t ...

  2. layui 新增行

    layui表格新增行目前只在从内存加载数据的情况下可行! 在多方查找数据与实验后,我发现layui确实只能在直接赋值数据(从内存加载数据)的情况下新增行,即首次渲染表格时使用内存数据给表格的data参 ...

  3. MFC之多字节和宽字节的总结

    ANSI字符集  所支持的就是多字节的也叫窄字节,类型来说就对应char类型.Unicode字符集 也叫宽字符集 所支持的就是宽字符集,从类型上来说就是 wchar_t类型.gb2312是中国的编码, ...

  4. 记录一下Android usb相关的知识学习

    在SecondStageMain中会先调用PropertyInit做属性初始化,该方法会调用PropertyLoadBootDefaults加载持久化的属性主要加载位置: /system/build. ...

  5. 深入探讨Function Calling:实现外部函数调用的工作原理

    引言 Function Calling 是一个允许大型语言模型(如 GPT)在生成文本的过程中调用外部函数或服务的功能. Function Calling允许我们以 JSON 格式向 LLM 模型描述 ...

  6. docker lnmp配置

    1.lnmp网络与目录规划 172.16.10.0/24 nginx:172.16.10.10 mysql:172.16.10.20 php:172.16.10.30 网站访问主目录:/wwwroot ...

  7. Windows库链接报错

    问题回溯 今天拿到别人已经编译好的库,发现在链接的时候出现了报错 [9/9 12.7/sec] Linking CXX shared module bin\plugins\AsensingPlugin ...

  8. Vue3.0+typescript+Vite+Pinia+Element-plus搭建vue3框架!

    使用 Vite 快速搭建脚手架 命令行选项直接指定项目名称和想要使用的模板,Vite + Vue 项目,运行(推荐使用yarn) # npm 6.x npm init vite@latest my-v ...

  9. wordpress博客系统报错

    第一种,只显示nginx的默认网页 说明wordpress的网页配置文件没有被系统读取 我们就需要去查看nginx的配置文件/etc/nginx/conf.d/default.conf 首先,查看是不 ...

  10. python-将多个表格的信息合并到一个表格中

    1.环境 代码运行环境:python3.7 相关的库:xlrd.xlwt 2.目的 通过xlrd库读取各个表格的数据,通过xlwt库将读取到的数据写入到一个表格中. 3.实现 在工程目录下,有一个te ...