java登錄攔截代碼 java攔截器實(shí)現(xiàn)

java如何寫(xiě)一個(gè)防止同賬號(hào)不同ip登錄的程序?請(qǐng)給出思路甚至代碼

在數(shù)據(jù)庫(kù)表中增加一個(gè)字段,記錄用戶(hù)登錄的ip,在每次登錄的時(shí)候都檢測(cè)一下該字段是否為空,如果不為空,那么比較數(shù)據(jù)庫(kù)中登錄的ip是否跟當(dāng)前ip相同,如果不同,那么強(qiáng)行登錄的話(huà)就將新的ip記錄寫(xiě)到數(shù)據(jù)庫(kù)中。

成都創(chuàng)新互聯(lián)公司專(zhuān)注于網(wǎng)站建設(shè)|成都企業(yè)網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋展覽展示等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷(xiāo)售的產(chǎn)品,結(jié)合品牌形象的塑造,量身設(shè)計(jì)品質(zhì)網(wǎng)站。

寫(xiě)一個(gè)過(guò)濾器,每次在訪(fǎng)問(wèn)Action的時(shí)候都判斷當(dāng)前的ip和數(shù)據(jù)庫(kù)中的是否相同,如果不同,那么就強(qiáng)制下線(xiàn),這樣就限制了另外一個(gè)用戶(hù)的訪(fǎng)問(wèn)。

用戶(hù)在自己退出的時(shí)候清空數(shù)據(jù)庫(kù)中的ip記錄,這樣就能保證不影響下次登錄。

還有一種方式就是在每個(gè)頁(yè)面都寫(xiě)一個(gè)定時(shí),每隔一定時(shí)間就向服務(wù)器發(fā)送一次請(qǐng)求判斷當(dāng)前ip與數(shù)據(jù)庫(kù)中保存的ip是否相同,如果不同就強(qiáng)制下線(xiàn)。但是這種方式比較耗費(fèi)連接。

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

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

一:實(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配置類(lèi):

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)建配置類(lèi):

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)的類(lèi)和方法的相關(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)建切片類(lèi):

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有什么注解前置前攔截

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

目錄和概述

概述

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

項(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è)方法是在訪(fǎng)問(wèn)接口之前執(zhí)行的,我們只需要在這里寫(xiě)驗(yàn)證登陸狀態(tài)的業(yè)務(wù)邏輯,就可以在用戶(hù)調(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;

// 之后寫(xiě)你的判斷邏輯:return true是通過(guò)攔截器,可以繼續(xù)訪(fǎng)問(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)附上原文出處鏈接及本聲明。

原文鏈接:

網(wǎng)頁(yè)題目:java登錄攔截代碼 java攔截器實(shí)現(xiàn)
網(wǎng)址分享:http://m.kartarina.com/article34/hgjcpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司電子商務(wù)移動(dòng)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站品牌網(wǎng)站制作App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
主站蜘蛛池模板: 本道久久综合无码中文字幕| 亚洲日韩精品无码专区网址| 精品无码成人片一区二区98| 中文字幕人妻三级中文无码视频| 中文字幕无码视频专区| 日韩精品无码免费专区午夜 | 中文字幕日韩精品无码内射| 黑人巨大无码中文字幕无码| 超清无码熟妇人妻AV在线电影| 亚洲∧v久久久无码精品| 人妻少妇精品无码专区| 亚洲国产综合无码一区| 无码人妻丰满熟妇区毛片18| 无码人妻熟妇AV又粗又大| 国产精品无码专区在线播放| 亚洲AV无码专区国产乱码电影| 日韩精品无码成人专区| 亚洲中文无码亚洲人成影院| 无码精品久久久久久人妻中字 | 成人麻豆日韩在无码视频| 亚洲av无码一区二区三区网站| 一本大道无码人妻精品专区| 久久久久亚洲Av无码专| 亚洲av无码一区二区三区不卡| 手机在线观看?v无码片| 色国产色无码色欧美色在线| 精品久久久久久无码专区| 久久久久久AV无码免费网站| 人妻少妇AV无码一区二区| 国产精品va在线观看无码| 无码天堂亚洲国产AV| 久久亚洲精品无码av| 久久无码av亚洲精品色午夜| 99久久人妻无码精品系列 | heyzo专区无码综合| 黑人无码精品又粗又大又长 | 国模无码一区二区三区| 国产精品无码无卡在线观看久| 少妇仑乱A毛片无码| 色综合色国产热无码一| MM1313亚洲精品无码久久|