導航:首頁 > 凈水問答 > 用過濾器攔截登錄

用過濾器攔截登錄

發布時間:2022-06-23 05:05:37

1. cas有些請求路徑不需要單點登錄過濾器攔截

業務系統web應用在使用單點登錄組件時,有些請求路徑不需要單點登錄過濾器攔截,比如公共開放的路徑,不需要認證都可以自由訪問的路徑,單點登錄過濾器配置的映射路徑一般以通配符匹配路徑,但要把這些路徑單獨提取出來,讓過濾器不攔截做單點登錄處理,就需要對原有過濾器進行擴展改造,才能實現這個功能。

擴展實現代碼如下:

public class CASFilter implements Filter {

public static enum ResponseType {
BREAK, GOON, RETURN
}

...

public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain fc){

。。。

CASReceipt receipt = (CASReceipt) session.getAttribute(CAS_FILTER_RECEIPT);

if (receipt != null && isReceiptAcceptable(receipt)) {
log.trace("CAS_FILTER_RECEIPT attribute was present and acceptable - passing request through filter..");
fc.doFilter(request, response);
return;
}else{
responeType = beforeDoSSOFilter(request, response);
if(ResponseType.RETURN==responeType){
return ;
}else if(ResponseType.BREAK==responeType) {
fc.doFilter(request, response);
return;
} //else go on
}

}

//過濾器的前置處理

public ResponseType beforeDoSSOFilter(ServletRequest request,
ServletResponse response) {
return ResponseType.GOON;

}

}

註:主要看原CASFilter 類紅字部分擴展代碼。

擴展實現類BMCASFilter

package com.sitechasia.sso.bmext;

public class BMCASFilter extends CASFilter {
private final Log log = LogFactory.getLog(this.getClass());
private static String ssoclient_passedPathSet;//設置不被sso過濾器攔截的請求路徑,需要符合url路徑通配符,多個路徑可以","分割
public static final String PASSEDPATHSET_INIT_PARAM="passedPathSet";//web.xml配置文件中的參數
@Override
public void init(FilterConfig config) throws ServletException {
super.init(config);
ssoclient_passedPathSet = SSOClientPropertiesSingleton.getInstance().getProperty(ClientConstants.SSOCLIENT_PASSEDPATHSET)==null?config.getInitParameter(PASSEDPATHSET_INIT_PARAM):SSOClientPropertiesSingleton.getInstance().getProperty(ClientConstants.SSOCLIENT_PASSEDPATHSET);
}

@Override
public ResponseType beforeDoSSOFilter(ServletRequest request,
ServletResponse response) {
if (ssoclient_passedPathSet != null) {//路徑過濾
HttpServletRequest httpRequest =(HttpServletRequest)request;
String requestPath = httpRequest.getRequestURI();
// String ls_requestPath = UrlUtils.buildFullRequestUrl(httpRequest.getScheme(), httpRequest.getServerName(), httpRequest.getServerPort(), requestPath, null);

PathMatcher matcher = new AntPathMatcher();
String passedPaths[]=null;
passedPaths =ssoclient_passedPathSet.split(",");

if(passedPaths!=null){
boolean flag;
for (String passedPath : passedPaths) {
flag = matcher.match(passedPath, requestPath);//ls_requestPath
if(flag){
log.info("sso client request path '"+requestPath+"'is matched,filter chain will be continued.");
return ResponseType.BREAK;
}
}
}
}
return ResponseType.GOON;
}

}

web.xml文件中配置修改如下:

<filter>
<description>單點登陸請求過濾器</description>
<filter-name>CASFilter</filter-name>
<filter-class>com.sitechasia.sso.dmext.filter.DMCASFilter</filter-class>

...

<init-param>
<description>排除路徑</description>
<param-name>passedPathSet</param-name>
<param-value>
/**/restful/userLogin/findPassword,
/**/restful/userLogin/findIllegalLoginCount,
/**/restful/tenantManager/**,
/**/restful/lock/**,
/**/restful/export/**
</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
< /filter-mapping>

。。。

註:紅字部分為相應配置內容擴展部分

經過上述這樣擴展,配置的排除路徑作為請求時,單點登錄過濾攔截就會忽略處理,實現了目標功能要求。

2. java web登陸狀態過濾器 圖片也被攔截了,怎麼辦

在過濾器中添加代碼String uri = request.getRequestURI();
過濾uri後綴是.js,.css的不進行校驗就好了,另外一種方法則相反,判斷你要的後綴,然後過濾,其他的都放行

3. 一個網站的許可權管理,用過濾器還是攔截器更好

Struts2項目通過使用Struts的if標簽進行了session判斷,使得未登錄的用戶不能看到頁面,但是這 種現僅僅在view層進行,如果未登錄用戶直接在地址欄輸入登錄用戶才能訪問的地址,那麼相應的action還是會執行,僅僅是不讓用戶看到罷了。這樣顯然是不好的,所以研究了一下Struts2的許可權驗證。
許可權最核心的是業務邏輯,具體用什麼技術來實現就簡單得多。
通常:用戶與角色建立多對多關系,角色與業務模塊構成多對多關系,許可權管理在後者關系中。
對許可權的攔截,如果系統請求量大,可以用Struts2攔截器來做,請求量小可以放在filter中。但一般單級攔截還不夠,要做到更細粒度的許可權控制,還需要多級攔截。

不大理解filter(過濾器)和interceptor(攔截器)的區別,遂google之。博文中有介紹:
1、攔截器是基於java的反射機制的,而過濾器是基於函數回調 。
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 。
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求 起作用 。
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能 。
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容 器初始化時被調用一次 。

4. java怎麼實現對某些需要登錄才能查看的頁面進行攔截不需要登錄的jsp頁面不需要攔截!請高手賜教!

如果是簡單的頁面許可權控制,採用過濾器完全就可以實現了。 實現思路:
1. 設計需要許可權訪問的頁面存放在指定的目錄,如: /A/xxx.JSP 。 不需要登錄訪問的頁面則不存放在A目錄下
2. 自己寫個過濾器, 過濾器攔截的URL為 /A/* (url-mapping的配置); 過濾器的邏輯是,只有登錄的請求,才forward請求的頁面,沒有登錄的請求則跳轉到登陸頁面

如果是復雜的許可權控制,可以考慮採用spring security 組件來實現,從而節省開發時間

5. 判斷用戶登錄是用springmvc 攔截器還是filter

在struts2中用過filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢?
一、定義

攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字元集,或者去除掉一些非法字元.。
二、xml文件配置
1.filter
該過濾器的方法是創建一個類XXXFilter實現此介面,並在該類中的doFilter方法中聲明過濾規則,然後在配置文件web.xml中聲明他所過濾的路徑

<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>

<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor

它也要實現HandlerInterceptor 介面,這里只介紹方法註解配置

<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>

三、具體區別

filter
Interceptor

多個的執行順序
根據filter mapping配置的先後順序
按照配置的順序,但是可以通過order控制順序

規范
在Servlet規范中定義的,是Servlet容器支持的
Spring容器內的,是Spring框架支持的。

使用范圍
只能用於Web程序中
既可以用於Web程序,也可以用於Application、Swing程序中。

深度
Filter在只在Servlet前後起作用
攔截器能夠深入到方法前後、異常拋出前後等

四、總結
兩者的本質區別:攔截器是基於java的反射機制的,而過濾器是基於函數回調。從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。

6. C#怎麼用過濾器實現防止用戶在沒有登陸的情況下直接訪問登陸後的那些頁面

登陸後為了能標識出用戶已登陸。
一般都是將登陸信息寫進Session中,或用Cookie保存。

所以內你只需要在那些登陸後容才能訪問的頁面的load事件里。判斷一下Session裡面的那個值存在不存在即可。

比如。登陸成功後添加了一個用戶名的Session
Session.Add("UserName",用戶名變數);

那麼在那個頁面判斷
if(Session["UserName"] == null)
{
Response.Redict("default.aspx");//跳轉回首頁
}

7. springmvc驗證登錄用過濾器還是攔截器

先執行filter,只有限制性過濾器之後才可以進入容器執行攔截

8. 如何用Filter實現對注冊用戶是否登錄的過濾

下面是我從前寫的項目里用的用戶過濾。供你參考。你可以去www.mldn.cn上看看,那兒有過濾器的視頻教程。
package filter;

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.* ;

//對用戶是否登錄進行過濾
public class UserFilter implements Filter
{

//過濾器初始化
public void init(FilterConfig filterConfig) throws ServletException
{

}

//實現Filter介面主方法
public void doFilter(ServletRequest request,

ServletResponse response,

FilterChain chain) throws ServletException,IOException
{
response.setContentType("text/html ;charset=GBK");
request.setCharacterEncoding("GBK");
PrintWriter out=response.getWriter();

HttpServletRequest req=(HttpServletRequest)request;
HttpSession session=req.getSession();
//System.out.println(session.getAttribute("user"));

//user是用戶登錄後session.setAtrribute("user",×××)中的user
if(session.getAttribute("user")!=null){
chain.doFilter(request, response);
}
else{//未登錄,後退
out.println("<script language='javascript'>alert('你還未登錄');");
out.println("history.go(-1);</script>");

}
}
//過濾器銷毀
public void destroy(){}
}

9. java web登錄後的各種請求在瀏覽器地址不變,過濾器該怎樣攔截每次的請求

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if(req.getSession().getAttribute("user")==null){
req.setAttribute("error", "請你先登錄");
//非法請求才會進到這裡面,在這里保存請求的url地址,在成功登錄後再進行跳轉
req.getSession().setAttribute("goUrl", req.getRequestURL()+"?"+ req.getQueryString());
request.getRequestDispatcher("/ulogin.jsp").forward(request, response);
}

else{
chain.doFilter(request, response);
}
}
上面的代碼是過濾器中的代碼
下面的是servlet中的代碼
if(request.getSession().getAttribute("goUrl")!=null){
String url = (String)request.getSession().getAttribute("goUrl");
response.sendRedirect(url);
}
else{
response.sendRedirect("/webshopping/index.jsp");
}

10. jsp中過濾器可以攔截請求和響應嗎

過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的信息。

閱讀全文

與用過濾器攔截登錄相關的資料

熱點內容
孝感自控蒸餾水器 瀏覽:356
塑料水桶水垢 瀏覽:623
魅族凈水器怎麼選 瀏覽:51
蒸餾得到的是固體嗎 瀏覽:884
家用什麼凈化器好用 瀏覽:371
反滲透膜殼能裝幾支膜 瀏覽:862
樂山鍋爐除垢劑 瀏覽:732
凈水器怎樣調廢水比 瀏覽:988
大型污水提升泵 瀏覽:954
如何製得純凈水 瀏覽:571
鹿邑縣有幾個污水處理廠 瀏覽:382
vmodel中使用過濾器 瀏覽:487
沒安空氣濾芯有什麼反應 瀏覽:6
老年人房間用什麼凈化器 瀏覽:249
污水處理廠輔助構築物的設計 瀏覽:973
水和廢水監測分析方法流速 瀏覽:260
地下污水池硫化氫中毒 瀏覽:447
盤龍污水處理廠提標 瀏覽:884
溴苯實驗中蒸餾瓶實驗現象 瀏覽:588
超濾濃水什麼情況迴流 瀏覽:644