使用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. YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

    前言 今天大姚给大家分享一款基于.NET Core Web + Bootstrap的企业级快速后台开发框架.权限管理系统,代码简单易懂.界面简洁美观(基于MIT License开源,免费可商用):Yi ...

  2. spiderFlow学习笔记

    1.下载demo demo地址:代码下载,文档地址:文档下载 2.加入selenium插件 文档有些,但我琢磨了好一会(QAQ) ①先去码云下载 spider-flow-selenium ②再把插件丢 ...

  3. zabbix笔记_001

    zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管 ...

  4. 如何在Spring Boot中配置MySQL数据库连接数

    1.如何在Spring Boot中配置MySQL数据库的连接数 1.1主要配置 在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置: (1)数据源配置:这通常是在applic ...

  5. uniapp 组件使用

    组件使用情况:页面出现多个相似的页面这个时候我们就可以把公共的页面进行封装,避免冗余的代码 1. compoents 目录下新建组件,名称随意[案例就叫 newsList]2. 开始封装需要多次使用的 ...

  6. drawio中添加数学公式

    1.drawio简介 drawio是一款免费开源的流程图绘制软件,由于软件免费,而且模块也很丰富,我比较喜欢用它. 软件下载地址:https://github.com/jgraph/drawio-de ...

  7. nodejs koa框架下载和导入excel

    ac.js const service = require("../service/model.service"); const urlencode = require(" ...

  8. 设定cookie 获取cookie数据的转换

    1,cookie必须是键值对形式的               键名=数值               而且必须是 字符串格式               document.cookie = 'nam ...

  9. zabbix分布式proxy

    1.为什么要学zabbix-proxy https://www.zabbix.com/documentation/4.0/zh/manual/distributed_monitoring/proxie ...

  10. redis 锁

    demo1 public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOExcepti ...