当前位置: 首页 > news >正文

springboot过滤字段_springboot实现拦截器之验证登录示例

整理文档,搜刮出一个springboot实现拦截器之验证登录示例,稍微整理精简一下做下分享。

添加jar包,这个jar包不是必须的,只是在拦截器里用到了,如果不用的话,完全可以不引入

org.apache.commons

commons-lang3

3.5

springboot默认为Tomcat,如果用jetty,还需要引入

javax.servlet

javax.servlet-api

3.1.0

1、以登录验证为例,首先创建个@Auth注解

package com.demo.interceptor;

import java.lang.annotation.*;

/**

* Created by huguoju on 2016/12/30.

* 在类或方法上添加@Auth就验证登录

*/

@Target({ElementType.TYPE,ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Auth {

}

2、创建一个Constants,在拦截器里用

package com.demo.util;

/**

* Created by huguoju on 2016/12/30.

*/

public interface Constants {

int MAX_FILE_UPLOAD_SIZE = 5242880;

String MOBILE_NUMBER_SESSION_KEY = "sessionMobileNumber";

String USER_CODE_SESSION_KEY = "userCode";

String SESSION_KEY = "sessionId";

}

3、创建一个SessionData,用于保存在session中的字段

package com.demo.model;

import lombok.Data;

/**

* Created by huguoju on 2016/12/30.

*/

@Data

public class SessionData {

private Integer userCode;

private String mobileNumber;

}

4、实现登录拦截实现

package com.demo.interceptor;

import com.demo.model.SessionData;

import com.demo.util.RedisUtil;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.lang.reflect.Method;

import static com.demo.util.Constants.MOBILE_NUMBER_SESSION_KEY;

import static com.demo.util.Constants.SESSION_KEY;

import static com.demo.util.Constants.USER_CODE_SESSION_KEY;

/**

* Created by huguoju on 2016/12/30.

*/

@Component

public class LoginInterceptor extends HandlerInterceptorAdapter {

@Autowired

private RedisUtil redisUtils;

private final static String SESSION_KEY_PREFIX = "session:";

public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {

if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) {

return true;

}

handlerSession(request);

final HandlerMethod handlerMethod = (HandlerMethod) handler;

final Method method = handlerMethod.getMethod();

final Class> clazz = method.getDeclaringClass();

if (clazz.isAnnotationPresent(Auth.class) ||

method.isAnnotationPresent(Auth.class)) {

if(request.getAttribute(USER_CODE_SESSION_KEY) == null){

throw new Exception();

}else{

return true;

}

}

return true;

}

public void handlerSession(HttpServletRequest request) {

String sessionId = request.getHeader(SESSION_KEY);

if(org.apache.commons.lang3.StringUtils.isBlank(sessionId)){

sessionId=(String) request.getSession().getAttribute(SESSION_KEY);

}

if (org.apache.commons.lang3.StringUtils.isNotBlank(sessionId)) {

SessionData model = (SessionData) redisUtils.get(SESSION_KEY_PREFIX+sessionId);

if (model == null) {

return ;

}

request.setAttribute(SESSION_KEY,sessionId);

Integer userCode = model.getUserCode();

if (userCode != null) {

request.setAttribute(USER_CODE_SESSION_KEY,Long.valueOf(userCode));

}

String mobile = model.getMobileNumber();

if (mobile != null) {

request.setAttribute(MOBILE_NUMBER_SESSION_KEY,mobile);

}

}

return ;

}

}

5、配置拦截器

package com.demo.interceptor;

import org.hibernate.validator.HibernateValidator;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.MessageSource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

import org.springframework.context.support.ReloadableResourceBundleMessageSource;

import org.springframework.validation.Validator;

import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import org.springframework.web.servlet.ViewResolver;

import org.springframework.web.servlet.config.annotation.*;

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import org.springframework.web.servlet.view.InternalResourceViewResolver;

/**

* Created by huguoju on 2016/12/30.

*/

@Configuration

@EnableWebMvc

@ComponentScan(basePackages = "com.demo.controller")

@PropertySource(value = "classpath:application.properties",ignoreResourceNotFound = true,encoding = "UTF-8")

public class MvcConfig extends WebMvcConfigurerAdapter {

private static final Logger logger = LoggerFactory.getLogger(MvcConfig.class);

@Autowired

LoginInterceptor loginInterceptor;

/**

*

* 视图处理器

*

*

* @return

*/

@Bean

public ViewResolver viewResolver() {

logger.info("ViewResolver");

InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

viewResolver.setPrefix("/WEB-INF/jsp/");

viewResolver.setSuffix(".jsp");

return viewResolver;

}

/**

* 拦截器配置

* @param registry

*/

@Override

public void addInterceptors(InterceptorRegistry registry) {

// 注册监控拦截器

registry.addInterceptor(loginInterceptor)

.addPathPatterns("/**")

.excludePathPatterns("/configuration/ui");

}

@Override

public void addCorsMappings(CorsRegistry registry) {

registry.addMapping("/**")

.allowedOrigins("*")

.allowedHeaders("*/*")

.allowedMethods("*")

.maxAge(120);

}

/**

* 资源处理器

* @param registry

*/

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

logger.info("addResourceHandlers");

registry.addResourceHandler("/swagger-ui.html")

.addResourceLocations("classpath:/META-INF/resources/");

registry.addResourceHandler("/webjars/**")

.addResourceLocations("classpath:/META-INF/resources/webjars/");

}

}

以上就完成了,测试时可以在LoginInterceptor里打断点,然后在controller上或者方法上添加@Auth注解,

controller上添加以后这个controller里所有请求都验证登录,在方法里添加只有请求这个方法时验证

@Auth

@RestController

public class TestController { }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

相关文章:

  • python计算机入门书籍_计算机学习--摘自python 入门书 侯爵
  • 如何卸载更换MySQL版本_mysql卸载(win10 适用于想更换版本的)
  • dos导入mysql文件_dos下导入mysql备份文件
  • java -jar 未响应_简单易学的测试攻略:JMeter测试Java请求示例
  • python 求余数_Python数据结构与算法——散列(Hash)
  • 此操作系统不支持 .net framework 4.6.2。_聊聊.net应用程序的Docker镜像
  • mysql binlog 实时_实时备份mysql binlog日志 脚本
  • oracle和mysql用户名_oracle 11g 默认用户名和密码
  • php mysql varchar_mysql中VARCHAR长度详细介绍
  • python图像读写技巧_Python图像读写方法对比
  • k8s一个容器多个镜像_AWS 容器三大新品:K8s 发行版,免费镜像库和 “Game Changer”AWS Proton...
  • c语言中的mecpy的用法_C语言的memcpy用法
  • python 判断字符串在数组中_一日一技:在 Golang 中如何快速判断字符串是否在一个数组中...
  • python像数常用函数_python图像处理常用函数
  • linux下查看mysql函数_linux下mysql函数的详细案列
  • axios 和 cookie 的那些事
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ESLint简单操作
  • Hexo+码云+git快速搭建免费的静态Blog
  • IP路由与转发
  • java2019面试题北京
  • jquery ajax学习笔记
  • js继承的实现方法
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Odoo domain写法及运用
  • Redis在Web项目中的应用与实践
  • Spring声明式事务管理之一:五大属性分析
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • use Google search engine
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 高程读书笔记 第六章 面向对象程序设计
  • 缓存与缓冲
  • 前嗅ForeSpider教程:创建模板
  • 详解移动APP与web APP的区别
  • 原生js练习题---第五课
  • 06-01 点餐小程序前台界面搭建
  • 1.Ext JS 建立web开发工程
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​什么是bug?bug的源头在哪里?
  • #if #elif #endif
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #考研#计算机文化知识1(局域网及网络互联)
  • (003)SlickEdit Unity的补全
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (南京观海微电子)——COF介绍
  • (七)Knockout 创建自定义绑定
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (图)IntelliTrace Tools 跟踪云端程序
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)ORM