真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java攔截器網(wǎng)頁(yè)代碼 java攔截器使用詳解

Java實(shí)現(xiàn)攔截HTTP請(qǐng)求的幾種方式

在Java的服務(wù)端開發(fā)當(dāng)中,攔截器是很常見的業(yè)務(wù)場(chǎng)景,這里對(duì)Java開發(fā)當(dāng)中幾種常見的攔截器的實(shí)現(xiàn)方式進(jìn)行記錄和分析。案例說(shuō)明基于Spring Boot環(huán)境。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的冀州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一:實(shí)現(xiàn)javax.servlet.Filter接口(使用過(guò)濾器方式攔截請(qǐng)求)

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 耗時(shí):"+(new Date().getTime()-start));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("time filter destroy");}}

如使用@Compent注解聲明不需要加入其它配置即可使得攔截器生效,但是默認(rèn)攔截/*,會(huì)攔截所有請(qǐng)求。

二:使用@Bean注入自定義攔截器,依然上面的代碼,去掉@Compent注解,創(chuàng)建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;}}

上面這兩種攔截請(qǐng)求的實(shí)現(xiàn)是基于JavaEE提供的Filter接口實(shí)現(xiàn)的,缺點(diǎn)在于,該攔截器實(shí)際上是一個(gè)過(guò)濾器,執(zhí)行代碼的方法doFilter只提供了request,response等參數(shù),當(dāng)請(qǐng)求進(jìn)入被過(guò)濾器攔截的時(shí)候,我們并不知道這個(gè)請(qǐng)求是由哪個(gè)控制器的哪個(gè)方法來(lái)執(zhí)行的。

三:使用springMVC提供的攔截器,實(shí)現(xiàn)org.springframework.web.servlet.HandlerInterceptor接口:

創(chuàng)建自定義的攔截器:

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 耗時(shí):"+(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 耗時(shí):"+(new Date().getTime()-start));System.out.println("ex is:"+e);}}

創(chuàng)建配置類:

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/*");}}

此種方式的攔截器當(dāng)中我們能夠獲取攔截的請(qǐng)求對(duì)應(yīng)的類和方法的相關(guān)信息,缺點(diǎn)在于該handler對(duì)象無(wú)法獲取具體執(zhí)行方法的參數(shù)信息。

四:利用Spring的切面(AOP)實(shí)現(xiàn)攔截器:

引入jar包:

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

創(chuàng)建切片類:

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 耗時(shí):"+(new Date().getTime()-start));System.out.println("time aspect end");return obj;}}

aspectj基于AOP實(shí)現(xiàn)的攔截器功能十分強(qiáng)大,具體詳解請(qǐng)參考spring官網(wǎng)網(wǎng)站的文檔。

java web 過(guò)濾器跟攔截器的區(qū)別和使用

區(qū)別如下:

1 、攔截器是基于java的反射機(jī)制的,而過(guò)濾器是基于函數(shù)回調(diào)。

2 、攔截器不依賴與servlet容器,過(guò)濾器依賴與servlet容器。

3 、攔截器只能對(duì)action請(qǐng)求起作用,而過(guò)濾器則可以對(duì)幾乎所有的請(qǐng)求起作用。

4 、攔截器可以訪問(wèn)action上下文、值棧里的對(duì)象,而過(guò)濾器不能訪問(wèn)。

5 、在action的生命周期中,攔截器可以多次被調(diào)用,而過(guò)濾器只能在容器初始化時(shí)被調(diào)用一次。

使用如下:

在Servlet作為過(guò)濾器使用時(shí),它可以對(duì)客戶的請(qǐng)求進(jìn)行處理。處理完成后,它會(huì)交給下一個(gè)過(guò)濾器處理,這樣,客戶的請(qǐng)求在過(guò)濾鏈里逐個(gè)處理,直到請(qǐng)求發(fā)送到目標(biāo)為止。例如,某網(wǎng)站里有提交“修改的注冊(cè)信息”的網(wǎng)頁(yè),當(dāng)用戶填寫完修改信息并提交后,服務(wù)器在進(jìn)行處理時(shí)需要做兩項(xiàng)工作:判斷客戶端的會(huì)話是否有效;對(duì)提交的數(shù)據(jù)進(jìn)行統(tǒng)一編碼。

這兩項(xiàng)工作可以在由兩個(gè)過(guò)濾器組成的過(guò)濾鏈里進(jìn)行處理。當(dāng)過(guò)濾器處理成功后,把提交的數(shù)據(jù)發(fā)送到最終目標(biāo);如果過(guò)濾器處理不成功,將把視圖派發(fā)到指定的錯(cuò)誤頁(yè)面。

擴(kuò)展資料:

攔截器,在AOP(Aspect-Oriented Programming)中用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。攔截是AOP的一種實(shí)現(xiàn)策略。

在Webwork的中文文檔的解釋為——攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制可以使開發(fā)者可以定義在一個(gè)action執(zhí)行的前后執(zhí)行的代碼,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行。同時(shí)也是提供了一種可以提取action中可重用的部分的方式。

過(guò)濾器是一個(gè)程序,它先于與之相關(guān)的servlet或JSP頁(yè)面運(yùn)行在服務(wù)器上。過(guò)濾器可附加到一個(gè)或多個(gè)servlet或JSP頁(yè)面上,并且可以檢查進(jìn)入這些資源的請(qǐng)求信息。

參考資料:百度百科-java

java有什么注解前置前攔截

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

目錄和概述

概述

假設(shè)需求:訪問(wèn)項(xiàng)目的controller是都要進(jìn)行"token驗(yàn)證",除了某些像登錄之類的方法。

項(xiàng)目結(jié)構(gòu):

TokenInterceptor.java 自定義攔截器

InterceptorConfig.java 添加攔截器進(jìn)入項(xiàng)目

NoNeedToken.java 自定義注解

TestController.java 測(cè)試接口

1、自定義攔截器

在 TokenInterceptor.java 中輸入以下代碼,以下的代碼將生成一個(gè)在請(qǐng)求到達(dá)controller前進(jìn)行攔截的攔截器

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

// 假設(shè)現(xiàn)在的token有如下數(shù)據(jù)

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

// 這個(gè)方法是在訪問(wèn)接口之前執(zhí)行的,我們只需要在這里寫驗(yàn)證登陸狀態(tài)的業(yè)務(wù)邏輯,就可以在用戶調(diào)用指定接口之前驗(yàn)證登陸狀態(tài)了

@Override

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

// 設(shè)置返回為json格式,使用UTF-8

response.setCharacterEncoding("UTF-8");

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

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

PrintWriter out;

// 之后寫你的判斷邏輯:return true是通過(guò)攔截器,可以繼續(xù)訪問(wèn)controller,return false是不通過(guò)

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 進(jìn)入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

}

}

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

版權(quán)聲明:本文為CSDN博主「魔王別囂張」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:

Java實(shí)現(xiàn)的攔截器

攔截器在在流行的開源框架中很常見 依賴的技術(shù)就是Java的動(dòng)態(tài)代理

理解攔截器的核心原理對(duì)理解這些開源框架的體系結(jié)構(gòu)至關(guān)重要

下面以一個(gè)簡(jiǎn)單的模型的來(lái)說(shuō)明攔截器的實(shí)現(xiàn)的一般方法

模型分為以下模塊

業(yè)務(wù)組件 是被代理和被攔截的對(duì)象

代理處理器 實(shí)現(xiàn)了InvocationHandler接口的一個(gè)對(duì)象

代理對(duì)象 Proxy對(duì)象

攔截器 普通的JavaBean 在調(diào)用業(yè)務(wù)方法的之前或者之后會(huì)自動(dòng)攔截并執(zhí)行自己的一些方法

客戶端 執(zhí)行業(yè)務(wù)處理的入口

以下是模型的實(shí)現(xiàn)

一 業(yè)務(wù)組件 分為業(yè)務(wù)接口和業(yè)務(wù)類

/**

* 業(yè)務(wù)組件接口

*/

public interface BusinessInterface {

public void doSomething();

}

/**

* 業(yè)務(wù)組件

*/

public class BusinessClass implements BusinessInterface{

public void doSomething() {

System out println( 業(yè)務(wù)組件BusinessClass方法調(diào)用:doSomething() );

}

}

二 代理處理器 包含了業(yè)務(wù)對(duì)象綁定動(dòng)態(tài)代理類的處理 并實(shí)現(xiàn)了 InvocationHandler接口的invoke方法

import java lang reflect InvocationHandler;

import java lang reflect Method;

import java lang reflect Proxy;

/**

* 動(dòng)態(tài)代理處理器工具

*/

public class DynamicProxyHandler implements InvocationHandler {

private Object business;??? //被代理對(duì)象

private InterceptorClass interceptor = new InterceptorClass();??? //攔截器

/**

* 動(dòng)態(tài)生成一個(gè)代理類對(duì)象 并綁定被代理類和代理處理器

*

* @param business

* @return 代理類對(duì)象

*/

public Object bind(Object business) {

this business = business;

return Proxy newProxyInstance(

//被代理類 的ClassLoader

business getClass() getClassLoader()

//要被代理 的接口 本方法返回對(duì)象會(huì)自動(dòng)聲稱實(shí)現(xiàn)了這些接口

business getClass() getInterfaces()

//代理處理 器對(duì)象

this);

}

/**

* 代理要調(diào)用的方法 并在方法調(diào)用前后調(diào)用連接器的方法

*

* @param proxy? 代理類對(duì)象

* @param method 被代理的接口方法

* @param args?? 被代理接口方法的參數(shù)

* @return 方法調(diào)用返回的結(jié)果

* @throws Throwable

*/

public Object invoke(Object proxy Method method Object[] args) throws Throwable {

Object result = null;

interceptor before();

result=method invoke(business args);

interceptor after();

return null;? //To change body of implemented methods use File | Settings | File Templates

}

}

三 攔截器 普通的JavaBean 在調(diào)用業(yè)務(wù)方法的之前或者之后會(huì)自動(dòng)攔截并執(zhí)行自己的 一些方法

/**

* 攔截器

*/

public class InterceptorClass {

public void before(){

System out println( 攔截器InterceptorClass方法調(diào)用:before()! );

}

public void after(){

System out println( 攔截器InterceptorClass方法調(diào)用:after()! );

}

}

四 模擬客戶端 執(zhí)行業(yè)務(wù)處理的入口

/**

* 客戶端

*/

public class Client {

public static void main(String args[]) {

DynamicProxyHandler handler = new DynamicProxyHandler();

BusinessInterface business = new BusinessClass();

BusinessInterface businessProxy = (BusinessInterface) handler bind(business);

businessProxy doSomething();

}

lishixinzhi/Article/program/Java/hx/201311/27143

求JAVA struts攔截器配置代碼

!-- 整合Spring --

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

!-- 開啟使用開發(fā)模式,詳細(xì)錯(cuò)誤提示 --

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

!-- 指定每次請(qǐng)求到達(dá),重新加載資源文件 --

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

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

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

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

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

!-- 設(shè)置該應(yīng)用使用的解碼集 --

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

!-- struts2 中默認(rèn)提供了一些訪問(wèn)靜態(tài)成員的方式,但是默認(rèn)是關(guān)閉的,所以應(yīng)該在struts2的配置文件中先設(shè)置 --

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"

!-- 攔截器-驗(yàn)證用戶登錄 --

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 !-- 設(shè)置需要攔截的方法,多個(gè)以逗號(hào)隔開 --

/interceptor-ref

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

/interceptor-stack

/interceptors

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

!-- 全局跳轉(zhuǎn)頁(yè)面 --

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


網(wǎng)站標(biāo)題:java攔截器網(wǎng)頁(yè)代碼 java攔截器使用詳解
地址分享:http://weahome.cn/article/hghgop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部