java代碼攔截器配置,攔截器javaweb

java有什么注解前置前攔截

本文將用簡潔的代碼構建一個springboot的攔截器。攔截器的使用很簡單,定義一個自己的攔截器,向配置中添加一下就可以使用。為了方便,之后又引入了注解。

網站建設哪家好,找創新互聯!專注于網頁設計、網站建設、微信開發、微信小程序、集團企業網站建設等服務項目。為回饋新老客戶創新互聯還提供了瑯琊免費建站歡迎大家使用!

目錄和概述

概述

假設需求:訪問項目的controller是都要進行"token驗證",除了某些像登錄之類的方法。

項目結構:

TokenInterceptor.java 自定義攔截器

InterceptorConfig.java 添加攔截器進入項目

NoNeedToken.java 自定義注解

TestController.java 測試接口

1、自定義攔截器

在 TokenInterceptor.java 中輸入以下代碼,以下的代碼將生成一個在請求到達controller前進行攔截的攔截器

import com.alibaba.fastjson.JSONObject;

import org.springframework.lang.Nullable;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.PrintWriter;

import java.util.Arrays;

import java.util.List;

@Component

public class TokenInterceptor implements HandlerInterceptor {undefined

// 假設現在的token有如下數據

List tokenList = Arrays.asList("111", "222", "333");

// 這個方法是在訪問接口之前執行的,我們只需要在這里寫驗證登陸狀態的業務邏輯,就可以在用戶調用指定接口之前驗證登陸狀態了

@Override

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

// 設置返回為json格式,使用UTF-8

response.setCharacterEncoding("UTF-8");

response.setContentType("application/json; charset=utf-8");

String token = request.getHeader("token");

PrintWriter out;

// 之后寫你的判斷邏輯:return true是通過攔截器,可以繼續訪問controller,return false是不通過

if (token == null || !tokenList.contains(token)) {undefined

// 如果失敗了返回{state:"false", msg:"token is null or wrong"}

JSONObject res = new JSONObject();

res.put("state","false");

res.put("msg","token is null or wrong");

out = response.getWriter();

out.append(res.toString());

return false;

}

// 否則返回true 進入controller

return true;

}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {undefined

}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {undefined

}

}

————————————————

版權聲明:本文為CSDN博主「魔王別囂張」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:

Java實現攔截HTTP請求的幾種方式

在Java的服務端開發當中,攔截器是很常見的業務場景,這里對Java開發當中幾種常見的攔截器的實現方式進行記錄和分析。案例說明基于Spring Boot環境。

一:實現javax.servlet.Filter接口(使用過濾器方式攔截請求)

import org.springframework.stereotype.Component;import javax.servlet.*;import java.io.IOException;import java.util.Date;@Componentpublic class TimeInterceptor implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long start = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("time filter 耗時:"+(new Date().getTime()-start));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("time filter destroy");}}

如使用@Compent注解聲明不需要加入其它配置即可使得攔截器生效,但是默認攔截/*,會攔截所有請求。

二:使用@Bean注入自定義攔截器,依然上面的代碼,去掉@Compent注解,創建TimeWebConfig配置類:

import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;import java.util.List;@Configurationpublic class TimeWebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();TimeInterceptor interceptor = new TimeInterceptor();registrationBean.setFilter(interceptor);ListString urls = new ArrayList();urls.add("/user/*");registrationBean.setUrlPatterns(urls);return registrationBean;}}

上面這兩種攔截請求的實現是基于JavaEE提供的Filter接口實現的,缺點在于,該攔截器實際上是一個過濾器,執行代碼的方法doFilter只提供了request,response等參數,當請求進入被過濾器攔截的時候,我們并不知道這個請求是由哪個控制器的哪個方法來執行的。

三:使用springMVC提供的攔截器,實現org.springframework.web.servlet.HandlerInterceptor接口:

創建自定義的攔截器:

import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;@Componentpublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) handler).getBean().getClass().getName());System.out.println(((HandlerMethod) handler).getMethod().getName());httpServletRequest.setAttribute("start", new Date().getTime());return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandler");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));System.out.println("ex is:"+e);}}

創建配置類:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate MyInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/user/*").excludePathPatterns("/blog/*");}}

此種方式的攔截器當中我們能夠獲取攔截的請求對應的類和方法的相關信息,缺點在于該handler對象無法獲取具體執行方法的參數信息。

四:利用Spring的切面(AOP)實現攔截器:

引入jar包:

!-- --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency

創建切片類:

import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.util.Date;@Aspect@Componentpublic class TimeAspect {@Around("execution(* com.qinker.controller.UserController.*(..))")public Object handlerControllerMethod(ProceedingJoinPoint point) throws Throwable {System.out.println("time aspect start");long start = new Date().getTime();Object[] args = point.getArgs();for (Object obj : args) {System.out.println("arg is:"+obj);}Object obj = point.proceed();//具體方法的返回值System.out.println("aspect 耗時:"+(new Date().getTime()-start));System.out.println("time aspect end");return obj;}}

aspectj基于AOP實現的攔截器功能十分強大,具體詳解請參考spring官網網站的文檔。

java如何實現攔截短信功能

java里的攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action

執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。在AOP中,攔截器用于在某個方法或者字段被訪問之前,進行攔截

然后再之前或者之后加入某些操作。目前,我們需要掌握的主要是Spring的攔截器,Struts2的攔截器不用深究,知道即可。

2,攔截器的原理

大部分時候,攔截器方法都是通過代理的方式來調用的。Struts2的攔截器實現相對簡單。當請求到達Struts2的ServletDispatcher時,Struts2

會查找配置文件,并根據配置實例化相對的攔截器對象,然后串成一個列表(List),最后一個一個的調用列表中的攔截器。Struts2的攔截器是可

插拔的,攔截器是AOP的一個實現。Struts2攔截器棧就是將攔截器按一定的順序連接成一條鏈。在訪問被攔截的方法或者字段時,Struts2攔截器鏈

中的攔截器就會按照之前定義的順序進行調用。

3,自定義攔截器的步驟

第一步:自定義一個實現了Interceptor接口的類,或者繼承抽象類AbstractInterceptor。

第二步:在配置文件中注冊定義的攔截器。

第三步:在需要使用Action中引用上述定義的攔截器,為了方便也可以將攔截器定義為默認的攔截器,這樣在不加特殊說明的情況下,所有的

Action都被這個攔截器攔截。

4,過濾器與攔截器的區別

過濾器可以簡單的理解為“取你所想取”,過濾器關注的是web請求;攔截器可以簡單的理解為“拒你所想拒”,攔截器關注的是方法調用,比如攔截

敏感詞匯。

4.1,攔截器是基于java反射機制來實現的,而過濾器是基于函數回調來實現的。(有人說,攔截器是基于動態代理來實現的)

4.2,攔截器不依賴servlet容器,過濾器依賴于servlet容器。

4.3,攔截器只對Action起作用,過濾器可以對所有請求起作用。

4.4,攔截器可以訪問Action上下文和值棧中的對象,過濾器不能。

4.5,在Action的生命周期中,攔截器可以多次調用,而過濾器只能在容器初始化時調用一次。

5,Spring攔截器

求JAVA struts攔截器配置代碼

!-- 整合Spring --

constant name="struts.objectFactory" value="spring"/

!-- 開啟使用開發模式,詳細錯誤提示 --

constant name="struts.devMode" value="false"/

!-- 指定每次請求到達,重新加載資源文件 --

!-- constant name="struts.i18n.reload" value="true"/ --

!-- 指定每次配置文件更改后,自動重新加載 --

!-- constant name="struts.configuration.xml.reload" value="true"/ --

!-- 指定XSLT Result使用樣式表緩存 --

!-- constant name="struts.xslt.nocache" value="true"/ --

!-- 設置該應用使用的解碼集 --

constant name="struts.i18n.encoding" value="UTF-8"/constant

!-- struts2 中默認提供了一些訪問靜態成員的方式,但是默認是關閉的,所以應該在struts2的配置文件中先設置 --

constant name="struts.ognl.allowStaticMethodAccess" value="true"/

include file="struts-default.xml" /

include file="struts-action.xml" /

---------------------------------------------------

struts-action.xml:

package name="com.lj.actions" extends="struts-default"

!-- 攔截器-驗證用戶登錄 --

interceptors

!-- interceptor name="check" class ="com.lj.interceptor.CheckLoginInterceptor" / --

interceptor name="authority" class="com.lj.interceptor.MyFilterInterceptor"/ !--上面自定義的攔截器類--

interceptor-stack name="myDefault"

interceptor-ref name="authority" !-- 引用攔截器 --

param name="includeMethods"queryByAll,queryByWhere,queryByAdId,queryByAdminAll,queryByWhere2CSV,adCheck,adDelete,delete,save,update,accredit,showInfo,appCheck/param !-- 設置需要攔截的方法,多個以逗號隔開 --

/interceptor-ref

interceptor-ref name="defaultStack"/interceptor-ref

/interceptor-stack

/interceptors

default-interceptor-ref name="myDefault"/default-interceptor-ref

!-- 全局跳轉頁面 --

global-results

result name="error_limit"/jsp/admin/error_limit.jsp/result

result name="list_sys_login"/jsp/admin/list_sys_login.jsp/result

/global-results

!-- 廣告管理——廣告審核 --

action name="AdCheck" class="com.lj.actions.AdCheckAction"

result name="list_ad_sh"/jsp/admin/list_ad_sh.jsp/result

/action

!-- 廣告管理——廣告列表 --

action name="AdList" class="com.lj.actions.AdListAction"

result name="list_ad_ls"/jsp/admin/list_ad_ls.jsp/result

/action

當前名稱:java代碼攔截器配置,攔截器javaweb
網頁網址:http://m.kartarina.com/article18/heiggp.html

成都網站建設公司_創新互聯,為您提供微信公眾號小程序開發品牌網站建設搜索引擎優化品牌網站制作網站設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 免费无码又爽又黄又刺激网站| 99无码人妻一区二区三区免费| 无码人妻精品内射一二三AV| 久久久久av无码免费网| 日韩乱码人妻无码中文字幕久久| 色综合久久无码中文字幕| 东京热一精品无码AV| 国产做无码视频在线观看浪潮| 久久无码专区国产精品发布 | 无码国产乱人伦偷精品视频| 精品一区二区三区无码免费视频 | 99精品国产在热久久无码| 无码一区二区三区在线| 欧洲Av无码放荡人妇网站| 久久久精品无码专区不卡| 久久亚洲AV成人无码电影| 狠狠躁天天躁无码中文字幕 | 精品久久久久久无码国产| 亚洲精品无码久久毛片波多野吉衣 | 亚洲熟妇无码另类久久久| 久久AV无码精品人妻出轨| 小13箩利洗澡无码视频网站| 人妻少妇伦在线无码| 丰满少妇人妻无码专区| 在线观看成人无码中文av天堂| 国产V亚洲V天堂A无码| 国产羞羞的视频在线观看 国产一级无码视频在线 | 国产AⅤ无码专区亚洲AV| 人妻少妇看A偷人无码精品| 日韩人妻无码精品一专区| 亚洲AV无码乱码国产麻豆穿越 | 综合无码一区二区三区| 国产成人无码AV在线播放无广告| 中文无码字慕在线观看| 18精品久久久无码午夜福利| 久久午夜夜伦鲁鲁片无码免费| 国产在线拍揄自揄拍无码| 日韩av无码中文无码电影| 国产成人无码免费网站| 黑人无码精品又粗又大又长 | 亚洲AV无码成人精品区在线观看 |