⑴ 前端如何實現登錄攔截
如一個購物商城, 當你瀏覽某個商品需要購買時, 點擊 購買按鈕 這時需要檢測是否登錄。
如果用戶已經登錄,則進入購買頁,否則進入登錄頁面。
如一個後台管理系統, 如果不登錄則不能訪問任何頁面。
有兩種攔截方式 路由攔截 和 http攔截器
一、路由攔截
首先在定義路由的時候就需要多添加一個自定義欄位 requireAuth,用於判斷該路由的訪問是否需要登錄。如果用戶已經登錄,則順利進入路由, 否則就進入登錄頁面。
定義完路由後,利用 vue-router 提供的鉤子函數 beforeEach() 對路由進行判斷。
每個鉤子方法接收三個參數:
to : ( Route ) 即將要進入的目標 路由對象
from : ( Route ) 當前導航正要離開的路由
next : ( Function ) 一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。
next() : 進行管道中燃迅的下一族正個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。
next(false) : 中斷當前的導航。如果瀏覽器的 URL 改變了(可能是用戶手動或者瀏覽器後退按鈕),那麼 URL 地址會重置到 from 路由對應的地址。
next(『/』) 或者 next({ path: 『/』 }) : 跳轉到一個不同的地址。當前的導航被中斷,然後進行一個新的導航。
確保要調用 next 方法,否則鉤子就不會被 resolved。
to.meta 中是我們自定義的數據,其中就包括我們剛剛定義的 requireAuth 欄位。通過這個欄位來判斷該路由是否需要登錄許可權。需要的話,同時當前應用不存在token,則跳轉到登錄頁面,進行登錄。登錄成功後跳轉到目標路由。
二、http攔截器
路由攔截只是簡單的前端路由控制,並不皮穗此能真正阻止用戶訪問需要登錄許可權的路由。還有一種情況便是:當前token失效了,但是token依然保存在本地。這時候你去訪問需要登錄許可權的路由時,實際上應該讓用戶重新登錄。
這時候就需要結合 http 攔截器 + 後端介面返回的http 狀態碼來判斷。
axios 的攔截器可通過配置http response inteceptor,當後端介面返回401 Unauthorized(未授權),讓用戶重新登錄。
如有不妥歡迎留言, 希望能幫助到你~
⑵ 微信一鍵登錄—JWT生成token、登錄攔截
1、掃碼授權登陸獲得用戶信息後,生成jwt token。返回給客戶端。
2、登錄攔截器
第一步:編寫攔截器
第二步:配置攔截器
第三步:controller編寫
測試:
1、訪問微信登錄
2、掃碼登錄。用返回的拼數絕接的url訪問微信開發平台
3、手機掃碼登錄
跳轉到網路頁面,這里頁面是第一步access_page中棚賀設置的,用來回調。
https://www..com/?token=eyJhbGciOiJIUzI1NiJ9._kyMSwiZXhwIjoxNTMyODY0MDgxfQ.-XVg&head_img=http://thirdwx.qlogo.cn/mmopen/vi_32/kWfVluL7B8Qcdho27Q/132&name=%E5%A4%9C%E6%9C%88%E4%BF%A0
第四鏈畢派步:postman測試
不加token:
錯誤token:
正確token:
⑶ 怎樣關閉瀏覽器的攔截功能
每個瀏覽器的操作方法都差不多,下面以360瀏覽器為例,具體方法如下:
1、首先打開360瀏覽器,可以看到在頁面的右上角有一個「工具」選項,單擊該選項。如下圖所示:
(3)登錄攔截器攔截背景圖片擴展閱讀:
攔截器可以說相當於是個過濾器:就是把 不想要的或不想顯示的內容給過濾掉。攔截器可以抽象出一部分代碼可以用來完善原來的action。同時可以減輕代碼冗餘,提高重用率。
比如在登入一個頁面時,如果要求用戶密碼、許可權等的驗證,就可以用自定義的攔截器進行密碼驗證和許可權限制。陸悔對符合的登入者才跳轉到正確頁面。這樣如果有新增許可權的話,不用在action里修改任何代碼,直接在interceptor里修改就行了。
1、好處:攔截器也可以讓你將通用的代碼模塊化並作為可重用的類。Struts2中的很多特性都是由攔截器來完成的。
2、作用:可以構局悉慶成攔截器棧,完成特定功能。比如日誌記錄、登錄判斷、許可權檢查等作用。
⑷ 使用springMVC的攔截器驗證登錄時,攔截器攔截了靜態的資源該怎麼解決
springmvc攔截器定義後,還需要在springmvc框架的配置文件中注冊,同時設置攔截的url路徑,即會造成對controller攔截的同時也對訪問的js和css文件進行攔截,可以通過配置不攔截js和css,例子如下
js和css放在web應用的static目錄下
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/static/**"/>--設置不攔截static下資源
頌並<beanclass="cn.sxt.rbac.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
鬧櫻空<mvc:exclude-mappingpath="/static/**"/>--設置不攔截static下資源
<beanclass="cn.sxt.rbac.interceptor.UrlInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
這樣在攔截液瞎controller同時,不會對static裡面的js、css或者其他靜態圖片資源進行攔截。
⑸ springmvc有哪些攔截器
1.DispatcherServlet
SpringMVC具有統一的入口DispatcherServlet,所有的請求都通過DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller來處理。 所以我們現在web.xml中加入以下配置:
[html]view plainprint?
<!--初始化DispatcherServlet時,該框架在web應用程序WEB-INF目錄中尋找一個名為[servlet-名稱]-servlet.xml的文件,
並在那裡定義相關的Beans,重寫在全局中定義的任何Beans-->
<servlet>
<servlet-name>springMybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMybatis</servlet-name>
<!--所有的的請陪碧求,都會被DispatcherServlet處理-->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.靜態資源不攔截
如果只配置攔截類似於*.do格式的url,則對靜態資源的訪問是沒有問題的,但是如果配置攔截了所有的請求(如我們上面配置的「/」),就會造成js文件、css文件、圖片文件等靜態資源無法訪問。
一般實現攔截器主要是為了許可權管理,主要是攔截一些url請求,所以不對靜態資源進行攔截。要過濾掉靜態資源一般有兩種方式,
第一種是採用<mvc:default-servlet-handler />,(一般Web應用伺服器默認的Servlet名稱是"default",所以這里我們激活Tomcat的defaultServlet來處理靜態文件,在web.xml里配置如下代碼即可:)
[html]view plainprint?
<!--該servlet為tomcat,jetty等容器提供,將蘆告舉靜態資源映射從/改為/static/目錄,如原來訪問http://localhost/foo.css,現在http://localhost/static/foo.css-->
<!--不攔截靜態文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
Tomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"
如果你所有的Web應用伺服器的默認Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:
[html]view plainprint?
<mvc:default-servlet-handlerdefault-servlet-name="所使用的Web伺服器默認使用的Servlet名稱"/>
第友察二種是採用<mvc:resources />,在springmvc的配置文件中加入以下代碼:
[html]view plainprint?
<mvc:resourcesmapping="/js/**"location="/static_resources/javascript/"/>
<mvc:resourcesmapping="/styles/**"location="/static_resources/css/"/>
<mvc:resourcesmapping="/images/**"location="/static_resources/images/"/>
3.自定義攔截器
SpringMVC的攔截器HandlerInterceptorAdapter對應提供了三個preHandle,postHandle,afterCompletion方法。preHandle在業務處理器處理請求之前被調用,
postHandle在業務處理器處理請求執行完成後,生成視圖之前執行,afterCompletion在DispatcherServlet完全處理完請求後被調用,可用於清理資源等 。所以要想實現自己的許可權管理邏輯,需要繼承HandlerInterceptorAdapter並重寫其三個方法。
首先在springmvc.xml中加入自己定義的攔截器我的實現邏輯CommonInterceptor,
[html]view plainprint?
<!--配置攔截器,多個攔截器,順序執行-->
<mvc:interceptors>
<mvc:interceptor>
<!--匹配的是url路徑,如果不配置或/**,將攔截所有的Controller-->
<mvc:mappingpath="/"/>
<mvc:mappingpath="/user/**"/>
<mvc:mappingpath="/test/**"/>
<beanclass="com.alibaba.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<!--當設置多個攔截器時,先按順序調用preHandle方法,然後逆序調用每個攔截器的postHandle和afterCompletion方法-->
</mvc:interceptors>
我的攔截邏輯是「在未登錄前,任何訪問url都跳轉到login頁面;登錄成功後跳轉至先前的url」,具體代碼如下:
[java]view plainprint?
/**
*
*/
packagecom.alibaba.interceptor;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.web.servlet.ModelAndView;
importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;
importcom.alibaba.util.RequestUtil;
/**
*@authortfj
*2014-8-1
*/
{
privatefinalLoggerlog=LoggerFactory.getLogger(CommonInterceptor.class);
publicstaticfinalStringLAST_PAGE="com.alibaba.lastPage";
/*
*利用正則映射到需要攔截的路徑
privateStringmappingURL;
publicvoidsetMappingURL(StringmappingURL){
this.mappingURL=mappingURL;
}
*/
/**
*在業務處理器處理請求之前被調用
*如果返回false
*從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈
*如果返回true
*執行下一個攔截器,直到所有的攔截器都執行完畢
*再執行被攔截的Controller
*然後進入攔截器鏈,
*從最後一個攔截器往回執行所有的postHandle()
*接著再從最後一個攔截器往回執行所有的afterCompletion()
*/
@Override
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
if("GET".equalsIgnoreCase(request.getMethod())){
RequestUtil.saveRequest();
}
log.info("==============執行順序:1、preHandle================");
StringrequestUri=request.getRequestURI();
StringcontextPath=request.getContextPath();
Stringurl=requestUri.substring(contextPath.length());
log.info("requestUri:"+requestUri);
log.info("contextPath:"+contextPath);
log.info("url:"+url);
Stringusername=(String)request.getSession().getAttribute("user");
if(username==null){
log.info("Interceptor:跳轉到login頁面!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
returnfalse;
}else
returntrue;
}
/**
*在業務處理器處理請求執行完成後,生成視圖之前執行的動作
*可在modelAndView中加入數據,比如當前時間
*/
@Override
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
log.info("==============執行順序:2、postHandle================");
if(modelAndView!=null){//加入當前時間
modelAndView.addObject("var","測試postHandle");
}
}
/**
*在DispatcherServlet完全處理完請求後被調用,可用於清理資源等
*
*當有攔截器拋出異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion()
*/
@Override
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
log.info("==============執行順序:3、afterCompletion================");
}
}
註:上述代碼里我寫了一個RequestUtil,主要實現獲取當前Request、Session對象,保存和加密頁面,取出等功能。
至此,攔截器已經實現了,效果如圖:
我直接訪問/test/hello,會被攔截
⑹ SpringBoot:訪問攔截器HandlerInterceptor的使用
完成
應用場景
1、日誌記錄,可以記錄請求信息的日誌,以便進行信息監控、信息統計等。
2、許可權檢查:如登陸檢測,進入處理器檢測是虛悶否登陸,如果沒有直接返回到登陸頁面。
3、性能監控:典型的是慢日誌。
攔截器我想大家都並不陌生,最常用的登錄攔截、或是許可權校驗、或是防重復提交、或是根據業務像12306去校驗購票時間,總之可以去做很多的事情。
定義一個Interceptor 非常簡單方式也有幾種,我這里簡單列舉兩種
1、類要實現Spring 的HandlerInterceptor 介面
2、類繼承實現了HandlerInterceptor 介面的類,例如 已經提供的實現了HandlerInterceptor 介面的抽象類HandlerInterceptorAdapter
preHandle:在業務處理器處理請求之前被調用。預處理,可以進行編碼、安全控制、許可權校驗等處理;
postHandle:在業務處理器處理請求執行完成後,生成視圖之前執行。後處理(調用了Service並返回ModelAndView,但未進行頁面渲染),有機會修改ModelAndView (這個博差返彎主就基本不怎麼用了);
afterCompletion:在DispatcherServlet完全處理完請求後被調用,可用於清理資源等。返回處理(已經渲染了頁面);
------------
這樣在我們業務中比如要記錄系統日誌,日誌肯定是在afterCompletion之後記錄的,否則中途失敗了,也記錄了,那就扯淡了。一定是程序正常跑完後,我們記錄下那些對資料庫做個增刪改的操作日誌進資料庫。所以我們只需要繼承HandlerInterceptorAdapter,並重寫afterCompletion一個方法即可,因為preHandle默認是true。
運行流程總結如下:
1、攔截器執行順序是按照Spring配置文件中定義的順序而定的。
2、會先按照順序執行所有攔截器的preHandle方法,一直遇到return false為止,比如第二個preHandle方法是return false,則第三個以及以後所有攔截器都不會執行。若都是return true,則按順序載入完preHandle方法。
3、然後執行主方法(自己的controller介面),若中間拋出異常,則跟return false效果一致,不會繼續執行postHandle,只會倒序執行afterCompletion方法。
4、在主方法執行完業務邏輯(頁面還未渲染數據)時,按倒序執行postHandle方法。若第三個攔截器的preHandle方法return false,則會執行第二個和第一個的postHandle方法和afterCompletion(postHandle都執行完才會執行這個,也就是頁面渲染完數據後,執行after進行清理工作)方法。(postHandle和afterCompletion都是倒序執行)
WebMvcConfigurer配置類其實是Spring內部的一種配置方式,採用JavaBean的形式來代替傳統的xml配置文件形式進行針對框架個性化定製,可以 自定義一些Handler,Interceptor,ViewResolver,MessageConverter 。基於java-based方式的spring mvc配置,需要創建一個 配置 類並實現 WebMvcConfigurer 介面;
在Spring Boot 1.5版本都是靠重寫 WebMvcConfigurerAdapter 的方法來世埋添加自定義攔截器,消息轉換器等。SpringBoot 2.0 後,該類被標記為@Deprecated(棄用)。官方推薦直接實現WebMvcConfigurer或者直接繼承WebMvcConfigurationSupport,方式一 實現WebMvcConfigurer介面( 推薦),方式二繼承WebMvcConfigurationSupport類
其中常用的方法:
以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然後再寫一個方法跳轉到頁面,感覺好麻煩,其實重寫WebMvcConfigurer中的addViewControllers方法即可達到效果了
值的指出的是,在這里重寫addViewControllers方法,並不會覆蓋 WebMvcAutoConfiguration (Springboot自動配置)中的addViewControllers(在此方法中,Spring Boot將「/」映射至index.html),這也就意味著 自己的配置和Spring Boot的自動配置同時有效 ,這也是我們推薦添加自己的MVC配置的方式。
比如,我們想 自定義靜態資源映射目錄 的話,只需重寫addResourceHandlers方法即可。
註:如果繼承WebMvcConfigurationSupport類實現配置時必須要重寫該方法,具體見其它文章
此時會注冊一個默認的Handler:,這個Handler也是用來處理靜態文件的,它會嘗試映射/。當DispatcherServelt映射/時(/ 和/ 是有區別的),並且沒有找到合適的Handler來處理請求時,就會交給 來處理。注意:這里的靜態資源是放置在web根目錄下,而非WEB-INF 下。
可能這里的描述有點不好懂(我自己也這么覺得),所以簡單舉個例子,例如:在webroot目錄下有一個圖片:1.png 我們知道Servelt規范中web根目錄(webroot)下的文件可以直接訪問的,但是由於DispatcherServlet配置了映射路徑是:/ ,它幾乎把所有的請求都攔截了,從而導致1.png 訪問不到,這時注冊一個 就可以解決這個問題。其實可以理解為DispatcherServlet破壞了Servlet的一個特性(根目錄下的文件可以直接訪問),是幫助回歸這個特性的。
這個方法是用來 配置視圖解析器 的,該方法的參數ViewResolverRegistry 是一個注冊器,用來注冊你想自定義的視圖解析器等。ViewResolverRegistry 常用的幾個方法:
⑺ spring mvc 攔截器登錄超時怎麼跳轉到登錄頁面
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"
default-autowire="byName">
<!--autoregisterProcessor-->
<context:annotation-config/>
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<propertyname="basePackage"value="com.anxin.msapweb.db.mybatis.mapper"/>
</bean>
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<propertyname="dataSource"ref="db2dataSource"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<!--需攔截的地址-->
<!--一級目錄-->
<mvc:mappingpath="/*.do"/>
<mvc:mappingpath="/*.ajax"/>
<mvc:mappingpath="/*.htm"純悔/>
<!--二級目錄-->
<mvc:mappingpath="/*/*.do"/>
<mvc:mappingpath="/*/*.ajax"/>
<mvc:mappingpath="/*/*.htm"/>
<!--需排除攔截的地址-->
<mvc:exclude-mappingpath="/login.htm"/>
<beanclass="com.anxin.msapweb.web.interceptor.SecurityInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
- 註:不支持<mvc:mapping path="*.do"做洞正 />
packagecom.anxin.msapweb.web.interceptor;
importjavax.servlet.http.HttpServletRequest;顫老
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpSession;
importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
importcom.anxin.msapweb.common.Config;
{
privatestaticfinalStringLOGIN_URL="/login.htm";
@Override
publicbooleanpreHandle(HttpServletRequestreq,HttpServletResponseres,Objecthandler)throwsException{
HttpSessionsession=req.getSession(true);
//從session裡面獲取用戶名的信息
Objectobj=session.getAttribute(Config.Passport.SESSION_NAME_LOGIN_RESULT);
//判斷如果沒有取到用戶信息,就跳轉到登陸頁面,提示用戶進行登陸
if(obj==null||"".equals(obj.toString())){
res.sendRedirect(LOGIN_URL);
}
returntrue;
}
@Override
publicvoidpostHandle(HttpServletRequestreq,HttpServletResponseres,Objectarg2,ModelAndViewarg3)throwsException{
}
@Override
publicvoidafterCompletion(HttpServletRequestreq,HttpServletResponseres,Objectarg2,Exceptionarg3)throwsException{
}
}
Java代碼