1. 程式人生 > >SpringMVC--自定義處理器攔截器(HandlerInterceptorAdapter)實現登入校驗

SpringMVC--自定義處理器攔截器(HandlerInterceptorAdapter)實現登入校驗

在後臺介面開發中會有一類介面是需要做登入校驗的,類似於生成訂單,檢視自己的訂單列表等介面,都需要先判斷使用者是否登入.雖然可以在介面中進行判斷,但是會讓程式碼冗餘,所以決定用自定義攔截器+自定義註解來完成這個功能

自定義攔截器可以實現HandlerInterceptor介面或者繼承HandlerInterceptorAdapter類,HandlerInterceptorAdapter介面卡是對HandlerInterceptor介面做了預設實現, 這種介面卡模式, 是為了方便開發者只去想要複寫方法, 其他方法採取預設措施.

public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
	private Logger log = LoggerFactory.getLogger(this.getClass());
	@Autowired
	TokenTools tokenTools;
	
	//在執行目標方法之前執行
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
		throws Exception {
		if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
			Authentication Authentication = ((HandlerMethod) handler)
					.getMethodAnnotation(Authentication.class);
			//如果沒用Authentication這個註解標註的介面或者validate=false則直接通過
			if (Authentication == null
					|| Authentication.validate() == false) {
				return true;
			} else {
				String userToken = request.getParameter("token");
				log.debug("current token**************: " + userToken);
				if (StringUtils.isBlank(userToken)) {
					returnValue(response);
					return false;
				} else {
					if (!tokenTools.checkLoginInfo(userToken)) {
						returnValue(response);
						return false;
					}
					log.debug("You have logged in successfully!");
					return true;
				}
			}
		}else {
			return true;
		}
	}
	
	private void returnValue(HttpServletResponse response)
			throws IOException {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("resultcode", "0003");
		resultMap.put("message", "登陸失效");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		response.getWriter().write(JSON.toJSONString(resultMap));
	}
}

自定義註解

/**
 * 需要登入的介面需要使用該註解
 * @author cihon
 *
 */
@Target(ElementType.METHOD) //指示註釋型別所適用的程式元素的種類。
@Retention(RetentionPolicy.RUNTIME) //指示註釋型別的註釋要保留多久。
public @interface Authentication {
	boolean validate() default true;
}

我們需要定義一個配置檔案的類來讓自定義攔截器生效

/**
 * 自定義攔截器配置檔案
 * @author cuizheng
 *
 */
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new AuthenticationInterceptor()
).addPathPatterns("/**"); } }

像下面這個介面加上@Authentication這個註解後就會做登入校驗的判斷

        @Authentication
	@RequestMapping({"/saveImage"})
	public String saveImage(@RequestHeader("header") String header,  String userName) {
		String s = new String(Base64.decode(body));
	
		return leBorrowService.saveImage(header,s);
	}

在這裡有可能會遇到Required request body is missing這個異常,是因為在攔截器中Request的引數一次性消費,並且不能回寫,解決辦法


如上圖,採用這種上傳方法,在攔截器中取出token後userName還能傳到介面中

相關推薦

SpringMVC--定義處理器攔截(HandlerInterceptorAdapter)實現入校

在後臺介面開發中會有一類介面是需要做登入校驗的,類似於生成訂單,檢視自己的訂單列表等介面,都需要先判斷使用者是否登入.雖然可以在介面中進行判斷,但是會讓程式碼冗餘,所以決定用自定義攔截器+自定義註解來完成這個功能自定義攔截器可以實現HandlerInterceptor介面或者

spring boot 定義登入攔截

        最近在努力學習spring boot中,這裡記錄一下攔截器的相關知識,在spring boot中,寫一個自定義的攔截器類,用於攔截不通過登入之後而進行的非法訪問,攔截的操作,也是日常專案中,都要用到的,不多說了,看正文。   &n

springMVC定義型別轉換(date型別轉換)

//日期的月份不能寫成小寫mm,因為在日期中還有分鐘mm,這兩者不能相同。 1.建立一個類實現Convert介面,實現convert方法 public date convert(String source){   if(source!=null&&!source.equals(""){

如何定義一個攔截

1、自定義攔截器類,實現HandlerInterceptor介面,並重寫抽象方法進行攔截器的攔截邏輯 // return true表示放行, return false表示攔截 public class Interceptor1 implements HandlerInterceptor{

定義註解攔截,防止表單重複提交

1.自定義註解 package com.paotui.util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import ja

java的 定義註解攔截

自定義的攔截器,是看了別人的文章,做的精簡,所以算是轉載 在專案中,右鍵,建立@ interface 這就是註解,在註解上加上 兩個註解 ,對這個註解進行限定 @Target(value=ElementType.METHOD)//定義了只能用於方法上 @Retention (Reten

Mybatis定義SQL攔截

本部落格介紹的是繼承Mybatis提供的Interface介面,自定義攔截器,然後將專案中的sql攔截一下,列印到控制檯。 先自定義一個攔截器 package com.muses.taoshop.common.core.database.config; import org.apache.commons

SpringMVC 5:處理器攔截

※. 處理器攔截器     SpringMVC的處理器攔截器類似於Servlet 開發中的過濾器Filter,     用於對處理器進行預處理和後處理。     1)常見應用場景         1、日誌記錄         2、許可權檢查         3、效能監控  

struts2定義登陸攔截

自定義登陸攔截器,實現功能為:對於Session域中未存在使用者資訊時(即未登入時),使用者訪問其他action時,強行跳轉到login頁面進行登陸。 攔截器程式碼如下: public class BOSLoginInterceptor extends MethodFilterInter

定義應用攔截

建立一個類 繼承interceptor post public class MyInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOExc

day03-定義struts2攔截

1. 攔截器的概述 * 攔截器就是AOP(Aspect-Oriented Programming)的一種實現。(AOP是指用於在某個方法或欄位被訪問之前,進行攔截然後在之前或之後加入某些操作。) * 過濾器:過濾從客服端傳送到伺服器端請求的 * 攔截器:攔截對目標Actio

Dubbo定義日誌攔截

前言 上一篇文章 Spring aop+自定義註解統一記錄使用者行為日誌 記錄了 web層中通過自定義註解配合Spring aop自動記錄使用者行為日誌的過程。那麼按照分散式架構中Dubbo服務層的呼叫過程是否也可以實現統一記錄日誌?自定義日誌攔截器可以實現這個需求。 需求場景 在使用

SpringMVC_23_定義攔截以及攔截的配置

自定義的攔截器 Spring MVC也可以使用攔截器對請求進行攔截處理,使用者可以自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor介面 preHandler():這個方法在業務處理器處理請求之前被呼叫,在該方法中對使

定義類載入實現

                Java的類載入器自從JDK1.2開始便引入了一條機制,叫做父類委託機制。也就是說,一個類需要被載

springMVC定義屬性編輯

自定義springMVC的屬性編輯器主要有兩種方式,一種是使用@InitBinder標籤在執行期註冊一個屬性編輯器,這種編輯器只在當前Controller裡面有效;還有一種是實現自己的 WebBindingInitializer,然後定義一個 AnnotationMethodHandlerAdapter的b

c# 實現定義事件訪問實現介面事件

event EventHandler IDrawingObject.OnDraw { add { lock (PreDrawEvent) {

springMvc定義型別轉換(把接收引數String轉成為Date型別)

1.  首先建立一個類,實現Converter介面,並實現其未實現方法。import org.springframework.core.convert.converter.Converter; public class CustomGlobalStrToDateConver

SpringBoot定義註解攔截,並根據環境變數選擇初始化

TimeStamp.java 自定義註解 import java.lang.annotation.*; /** * @author Meng.Liu * @create 2017-10-30

SpringDataJpa定義事務攔截

作用為 不用寫Transactional,用AOP來實現自動分配事務 如下 package com.fewstrong.common; import java.util.Collections; import java.util.HashMap; import

定義OKhttp攔截 新增請求頭

新建一個類UserAgentInterceptor實現Interceptor import java.io.IOException;   import okhttp3.Interceptor