本次案例工具为:SpringBoot   <version>1.5.19.RELEASE</version>

Code:

1、annotations

package com.mlq.annotations;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented
@Retention(RUNTIME)
@Target(METHOD)
public @interface ActionAuth {
enum Type {
DEMO, TEST
} /**
* 操作类型
*
* @return
*/
Type value() default Type.DEMO; /**
* 操作名称
*
* @return
*/
String name() default ""; /**
* 操作Code
*
* @return
*/
String code() default ""; }

ActionAuth

2、config

package com.mlq.config;

import com.mlq.interceptors.AppInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /**
* @Description: 拦截器config
*/
@Configuration
public class WebConfigurerConfig extends WebMvcConfigurerAdapter { @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AppInterceptor()).addPathPatterns("/**");
} }

WebConfigurerConfig

3、controller

package com.mlq.controller;

import com.mlq.annotations.ActionAuth;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/signature/")
public class SignatureTest { @RequestMapping("getSignature")
public Object getSignature() {
return "验证通过";
} @ActionAuth(value = ActionAuth.Type.DEMO, name = "ok", code = "ok")
@RequestMapping("ok")
public Object ok() {
return "验证通过";
} }

SignatureTest

4、exception

package com.mlq.exception;

import com.mlq.tools.ErrorPrintUtils;

public abstract class AbstractException extends RuntimeException {

    private static final long serialVersionUID = -5992753399315247713L;
private String errorCode;
private String errorMsg;
private String stackTraceMsg;
private String level;
private String messageID;
private boolean sendMsg = true; public AbstractException(String code, String message, String... level) {
super(code + "|" + message);
this.handleExceptionMessage(code, message, code + "|" + message);
} public AbstractException(String code, String message, Throwable th) {
super(code + "|" + message, th);
this.handleExceptionMessage(code, message, ErrorPrintUtils.printStackTrace(th));
} public final void handleExceptionMessage(String code, String message, String stackTraceMsg) {
this.errorCode = code;
this.errorMsg = message;
this.stackTraceMsg = stackTraceMsg;
} public AbstractException(Throwable cause) {
super(cause);
AbstractException.ErrorDesc errorDesc = this.getErrorDesc(cause);
if (errorDesc != null) {
this.errorCode = errorDesc.errorCode;
this.errorMsg = errorDesc.errorMsg;
} } public AbstractException(String message) {
super(message);
} public abstract AbstractException.ErrorDesc getErrorDesc(Throwable var1); public String getErrorCode() {
return this.errorCode;
} public String getErrorMsg() {
return this.errorMsg;
} public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
} public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
} public String getStackTraceMsg() {
return this.stackTraceMsg;
} public void setStackTraceMsg(String stackTraceMsg) {
this.stackTraceMsg = stackTraceMsg;
} public String getLevel() {
return this.level;
} public void setLevel(String level) {
this.level = level;
} public String getMessageID() {
return this.messageID;
} public void setMessageID(String messageID) {
this.messageID = messageID;
} public boolean isSendMsg() {
return this.sendMsg;
} public void setSendMsg(boolean sendMsg) {
this.sendMsg = sendMsg;
} public static class ErrorDesc {
public String errorCode;
public String errorMsg; public ErrorDesc(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
} }

AbstractException

package com.mlq.exception;

public class ControllerException extends AbstractException {

    private static final long serialVersionUID = 8307533385237791476L;

    public ControllerException(String code, String message) {
super(code, message, new String[0]);
} public ControllerException(String code, String message, Throwable th) {
super(code, message, th);
} public AbstractException.ErrorDesc getErrorDesc(Throwable var1) {
return null;
} }

ControllerException

package com.mlq.exception;

/**
* JsonException
*/
public class JsonException extends ControllerException { private static final long serialVersionUID = -5605565877150120787L; public JsonException(String code, String message) {
super(code, message);
} public JsonException(String code, String message, Throwable th) {
super(code, message, th);
} }

JsonException

5、interceptors

package com.mlq.interceptors;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.mlq.annotations.ActionAuth;
import com.mlq.exception.JsonException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; /**
* 权限拦截器
*/
public class AppInterceptor implements HandlerInterceptor { /**
* 日志输出
*/
private static final Logger LOGGER = LoggerFactory.getLogger(AppInterceptor.class); @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判断是否为处理程序方法
if (handler instanceof HandlerMethod) {
//强制类型转换
HandlerMethod method = (HandlerMethod) handler;
//获取方法指定签名
ActionAuth actionAuth = method.getMethodAnnotation(ActionAuth.class);
LOGGER.info("授权对象:actionAuth={}", actionAuth != null);
if (!ObjectUtils.isEmpty(actionAuth)) {
if (actionAuth.value().equals(ActionAuth.Type.DEMO)) {
return true;
} else {
throw new JsonException("500", "缺少权限配置");
}
} else {
throw new JsonException("500", "缺少权限配置:缺少签名配置");
}
/*
* 验证请求的方法上有没有固定签名设置...
* */
}
// Ajax 请求
if (checkAjaxRequest(request)) { }
return true;
} @Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
LOGGER.info("后期处理!!!");
} @Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
LOGGER.info("完成处理!!!");
} /**
* Ajax 请求
*
* @param request
* @return
*/
private boolean checkAjaxRequest(HttpServletRequest request) {
String requestType = request.getHeader("X-Requested-With");
// Ajax请求
if (!ObjectUtils.isEmpty(requestType) && "XMLHttpRequest".equals(requestType)) {
return true;
}
return false;
}
}

AppInterceptor

6、tools

package com.mlq.tools;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter; public class ErrorPrintUtils { public ErrorPrintUtils() {
} public static String printStackTrace(Throwable exception) {
StringWriter sw = null;
PrintWriter pw = null;
try {
sw = new StringWriter();
pw = new PrintWriter(sw);
exception.printStackTrace(pw);
} finally {
if (sw != null) {
try {
sw.close();
} catch (IOException var8) {
;
}
}
if (pw != null) {
pw.close();
}
}
return sw.toString();
}
}

ErrorPrintUtils

提示:所有请求都会被拦截 要是不满足签名规范则会抛出异常

coding++:java-自定义签名+拦截器的更多相关文章

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

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

  2. Mybatis自定义SQL拦截器

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

  3. Java三大器之拦截器(Interceptor)的实现原理及代码示例

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  4. 【java web】拦截器inteceptor

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

  5. SpringMVC 自定义一个拦截器

    自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...

  6. java struts学习-拦截器

    引言: Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此,在拦截器中如果使用类变量,要注意同步问题. •       ...

  7. Java结合SpringBoot拦截器实现简单的登录认证模块

    Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...

  8. Dubbo自定义日志拦截器

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

  9. springmvc自定义的拦截器以及拦截器的配置

    一.自定义拦截器 Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口. 二.HandlerIn ...

随机推荐

  1. 46-Python深浅拷贝

    目录 一.引言 1.1 可变或不可变 二.拷贝 三.浅拷贝 深拷贝 一.引言 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象 ...

  2. 使用web写UI, 使用js对接C++项目, 提高开发效率

    ppt资源下载地址https://www.slidestalk.com/s/webui_nodejs_cmdlrx

  3. JZOJ 1736. 扑克游戏 (Standard IO)

    1736. 扑克游戏 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 有一棵无穷大的满二叉树,根为sta ...

  4. Yuchuan_Linux_C编程之一 Vim编辑器的使用

    一.整体大纲 二.Vim 编辑器的使用 vi -- vim    vim是从vi发展过来的一款文本编辑器    vi a.txt    前提: 安装了vim软件 工作模式: 1. 命令模式 -- 打开 ...

  5. 读《Java并发编程的艺术》学习笔记(一)

    接下来一个系列,是关于<Java并发编程的艺术>这本书的读书笔记以及相关知识点,主要是为了方便日后多次复习和防止忘记.废话不多说,直接步入主题: 第1章  并发编程的挑战 并发编程的目的是 ...

  6. 关于js拖放功能的实现

    这是具体的拖放代码的HTML,里面依赖两个组件:EventUtil.js是兼容浏览器添加方法的库,EventTarget.js是一个发布-订阅者模式的对象库. EventUtil.js: var Ev ...

  7. 教你高效使用数据可视化BI软件创建医院卫生耗材运营监控大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以医院卫生耗材运营监控大屏 ...

  8. Asp.net 的DropDownList 控件动态加载

    在做连接数据库表,在页面上用DropDownList 下拉框查询某条数据时,因为数据库里的数据,随时都有可能增加或减少,而下拉框关联的某个字段的值并不一定是固定的. 表信息: CREATE TABLE ...

  9. 作为一位Vue工程师,这些开发技巧你都会吗?

    路由参数解耦 一般在组件内使用路由参数,大多数人会这样做: export default { methods: { getParamsId() { return this.$route.params. ...

  10. 74. pNextID、pNextVal、pNID的区别

    pNextID是平台调用单个新增组件的时候调用的: pNextVal是平台批量新增的时候调用: pNID应该是自己写的 :