1. 程式人生 > >Struts2對jsp頁面進行攔截

Struts2對jsp頁面進行攔截

加粗顯示,以示尊重。
最近需要對jsp進行許可權攔截的問題,但Struts2攔截器無法對Jsp進行攔截,如果非要攔截,可以採用都全部經過Action來訪問,但是我個人覺得過於繁瑣,轉載的這篇博主文章,我覺得是很不錯的選擇。
這裡我補充說下,如果要攔截的jsp頁面不是位於根目錄下,比如不登入就不能訪問/admin/view/(*.jsp),即某個子資料夾下所有jsp頁面情況,原博文的配置如下:

<filter-mapping>    
   <filter-name>SessionInvalidate</filter-name>  //需要過濾的檔案  
<url-pattern>*.jsp</url-pattern> </filter-mapping>

但是要實現這種情況,不能自以為的聰明的寫成/admin/view/*.jsp,這並不是規範配置的寫法。可以考慮一下三種方式。
這裡寫圖片描述

    <filter-mapping>
        <filter-name>SessionInvalidate</filter-name>  <!-- //需要過濾的檔案 -->
        <url-pattern>/admin/view/*</url-pattern
>
</filter-mapping>

也就是說改成以上的方式,但是會連*.html等所有目錄下都進行了過濾 攔截,這是需要注意的地方。

以下是原博主的主要原文

Struts2中攔截器大家都很經常使用,但是攔截器只能攔截action不能攔截jsp頁面。這個時候就有點尷尬了,按道理來說沒登入的使用者只能看login介面不能夠通過輸入URL進行介面跳轉,這顯然是不合理的。這裡介紹Struts2中Filter實現jsp頁面攔截的功能。(有興趣的人可以去研究Filter過濾器的其它用法,因為利用過濾器也可以實現action攔截的功能)

下面直接上程式碼,邊看邊分析實現步驟和原理。

1.web.xml中的配置資訊:

[html] view plain copy print?
  1. <filter>
  2.    <filter-name>SessionInvalidate</filter-name>
  3.    <filter-class>com.tp.action.SessionCheckFilter</filter-class>  //過濾器核心類的class地址  
  4.    <init-param>
  5.      <param-name>checkSessionKey</param-name>  //session中需要檢查的key  
  6.      <param-value>users</param-value>
  7.    </init-param>
  8.    <init-param>
  9.      <param-name>redirectURL</param-name>  //過濾重定向的地址  
  10.      <param-value>/login.jsp</param-value>
  11.    </init-param>
  12.    <init-param>
  13.      <param-name>notCheckURLList</param-name>  //不需要過濾的jsp  
  14.      <param-value>/login.jsp</param-value>
  15.    </init-param>
  16.  </filter>
  17.  <filter-mapping>
  18.    <filter-name>SessionInvalidate</filter-name>  //需要過濾的檔案  
  19.    <url-pattern>*.jsp</url-pattern>
  20.  </filter-mapping>
    <filter>  
    <filter-name>SessionInvalidate</filter-name>  
    <filter-class>com.tp.action.SessionCheckFilter</filter-class>  //過濾器核心類的class地址
    <init-param>  
      <param-name>checkSessionKey</param-name>  //session中需要檢查的key
      <param-value>users</param-value>  
    </init-param>  
    <init-param>  
      <param-name>redirectURL</param-name>  //過濾重定向的地址
      <param-value>/login.jsp</param-value>  
    </init-param>  
    <init-param>  
      <param-name>notCheckURLList</param-name>  //不需要過濾的jsp
      <param-value>/login.jsp</param-value>  
    </init-param>  
  </filter>  

  <filter-mapping>  
    <filter-name>SessionInvalidate</filter-name>  //需要過濾的檔案
    <url-pattern>*.jsp</url-pattern>  
  </filter-mapping>  
    

這裡有幾點需要注意的是:

1.過濾器要儘量放在Struts2配置程式碼的上面。

2.在SessionInvalidate中 <url-pattern>*.jsp</url-pattern>  配置非常重要。*.jsp表示只過濾jsp的介面不會把css,js,action一起給過濾了。如果寫成/*就會把所有的東西一起過濾了。包括css,js,action等。所以這個地方一定要看仔細。

2。SessionCheckFilter過濾的核心類:

[java] view plain copy print?
  1. package com.tp.action;  
  2. import java.io.IOException;    
  3. import java.util.HashSet;    
  4. import java.util.Set;    
  5. import javax.servlet.Filter;    
  6. import javax.servlet.FilterChain;    
  7. import javax.servlet.FilterConfig;    
  8. import javax.servlet.ServletException;    
  9. import javax.servlet.ServletRequest;    
  10. import javax.servlet.ServletResponse;    
  11. import javax.servlet.http.HttpServletRequest;    
  12. import javax.servlet.http.HttpServletResponse;    
  13. import javax.servlet.http.HttpSession;    
  14. / 
  15.   用於檢測使用者是否登陸的過濾器,如果未登入,則重定向到指的登入頁面 配置引數 checkSessionKey 需檢查的在 Session 中儲存的關鍵字  
  16.   redirectURL 如果使用者未登入,則重定向到指定的頁面,URL不包括 ContextPath notCheckURLList  
  17.   不做檢查的URL列表,以分號分開,並且 URL 中不包括 ContextPath  
  18.  */
  19. publicclass SessionCheckFilter implements Filter {    
  20.   protected FilterConfig filterConfig = null;    
  21.   private String redirectURL = null;    
  22.   private Set<String> notCheckURLList = new HashSet<String>();    
  23.   private String sessionKey = null;    
  24.   @Override
  25.   publicvoid destroy() {    
  26.     notCheckURLList.clear();    
  27.   }    
  28.   @Override
  29.   publicvoid doFilter(ServletRequest servletRequest,    
  30.       ServletResponse servletResponse, FilterChain filterChain)    
  31.       throws IOException, ServletException {    
  32.     HttpServletRequest request = (HttpServletRequest) servletRequest;    
  33.     HttpServletResponse response = (HttpServletResponse) servletResponse;    
  34.     HttpSession session = request.getSession();    
  35.     if (sessionKey == null) {    
  36.       filterChain.doFilter(request, response);    
  37.       return;    
  38.     }    
  39.     if ((!checkRequestURIIntNotFilterList(request))    
  40.         && session.getAttribute(”users”) == null) {    
  41.          response.sendRedirect(request.getContextPath() + redirectURL);    
  42.       return;    
  43.     }    
  44.     filterChain.doFilter(servletRequest, servletResponse);    
  45.   }    
  46.   privateboolean checkRequestURIIntNotFilterList(HttpServletRequest request) {    
  47.     String uri = request.getServletPath()    
  48.         + (request.getPathInfo() == null ? “” : request.getPathInfo());    
  49.     String temp = request.getRequestURI();  
  50.     temp = temp.substring(request.getContextPath().length() + 1);    
  51.     // System.out.println(“是否包括:”+uri+”;”+notCheckURLList+”==”+notCheckURLList.contains(uri));  
  52.     return notCheckURLList.contains(uri);    
  53.   }    
  54.   @Override
  55.   publicvoid init(FilterConfig filterConfig) throws ServletException {    
  56.     this.filterConfig = filterConfig;    
  57.     redirectURL = filterConfig.getInitParameter(”redirectURL”);    
  58.     sessionKey = filterConfig.getInitParameter(”checkSessionKey”);    
  59.     String notCheckURLListStr = filterConfig    
  60.         .getInitParameter(”notCheckURLList”);    
  61.     if (notCheckURLListStr != null) {    
  62.       System.out.println(notCheckURLListStr);    
  63.       String[] params = notCheckURLListStr.split(”,”);    
  64.       for (int i = 0; i < params.length; i++) {    
  65.         notCheckURLList.add(params[i].trim());    
  66.       }    
  67.     }    
  68.   }    
  69. }    
package com.tp.action; 
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 用於檢測使用者是否登陸的過濾器,如果未登入,則重定向到指的登入頁面 配置引數 checkSessionKey 需檢查的在 Session 中儲存的關鍵字
* redirectURL 如果使用者未登入,則重定向到指定的頁面,URL不包括 ContextPath notCheckURLList
* 不做檢查的URL列表,以分號分開,並且 URL 中不包括 ContextPath
*/
public class SessionCheckFilter implements Filter {
protected FilterConfig filterConfig = null;
private String redirectURL = null;
private Set<String> notCheckURLList = new HashSet<String>();
private String sessionKey = null;
@Override
public void destroy() {
notCheckURLList.clear();
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if (sessionKey == null) {
filterChain.doFilter(request, response);
return;
}
if ((!checkRequestURIIntNotFilterList(request))
&& session.getAttribute("users") == null) {
response.sendRedirect(request.getContextPath() + redirectURL);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
}
private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) {
String uri = request.getServletPath()
+ (request.getPathInfo() == null ? "" : request.getPathInfo());
String temp = request.getRequestURI();
temp = temp.substring(request.getContextPath().length() + 1);
// System.out.println("是否包括:"+uri+";"+notCheckURLList+"=="+notCheckURLList.contains(uri));
return notCheckURLList.contains(uri);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
redirectURL = filterConfig.getInitParameter("redirectURL");
sessionKey = filterConfig.getInitParameter("checkSessionKey");
String notCheckURLListStr = filterConfig
.getInitParameter("notCheckURLList");
if (notCheckURLListStr != null) {
System.out.println(notCheckURLListStr);
String[] params = notCheckURLListStr.split(",");
for (int i = 0; i < params.length; i++) {
notCheckURLList.add(params[i].trim());
}
}
}
}
到這裡過濾器的功能就實現了。再重申一下web.xml中配置的資訊,需要好好檢查檢查因為那裡是過濾器是否成功的關鍵。

相關推薦

Struts2jsp頁面進行攔截

加粗顯示,以示尊重。 最近需要對jsp進行許可權攔截的問題,但Struts2攔截器無法對Jsp進行攔截,如果非要攔截,可以採用都全部經過Action來訪問,但是我個人覺得過於繁瑣,轉載的這篇博主文章,我覺得是很不錯的選擇。 這裡我補充說下,如果要

實現Struts2未登入的jsp頁面進行攔截功能(採用的是Struts2中過濾器進行過濾攔截

Struts2中攔截器大家都很經常使用,但是攔截器只能攔截action不能攔截jsp頁面。這個時候就有點尷尬了,按道理來說沒登入的使用者只能看login介面不能夠通過輸入URL進行介面跳轉,這顯然是不合理的。這裡介紹Struts2中Filter實現jsp頁面攔截的功能。(有

js通過cookie兩個沒有關系的jsp頁面進行傳值

IT eva 有關 time bsp 關系 cape document 兩個   //Cookie取值   function readCookie (name)   {     var cookieValue = "";     v

springMVCjsp頁面的數據進行校驗

false long w3c set 提示 gre password request dmi 一. 使用註解校驗 a) 引入校驗依賴包 <dependency> <groupId>javax.validation</gr

PDF編輯工具怎樣PDF頁面進行裁剪

       在很多的時候,不管是在學習中,還是在工作中,都會使用到PDF檔案,而PDF檔案的修改編輯是需要使用到PDF編輯軟體的,那麼,PDF編輯工具怎樣對PDF頁面進行裁剪呢,估計有很多的小夥伴也想知道怎麼操作吧,那就看看下面的文章,說不定就會了哦。 &nbs

在IDEA中配置spring boot jsp頁面的支援

現在前後的分離的,一般springboot 就用來做後臺restful 介面,那麼如果要前後端合併在springboot呢?可以通過下面幾個簡單的步驟,增加對jsp的支援。 (1)pom增加依賴: <!--springboot tomcat jsp 支援開啟--&g

網路爬蟲系列之二:下載頁面進行連結解析

        在我的上一篇部落格中,通過URL就已經成功下載了第一個頁面。然後我第二步的工作就是要通過這個已經下載好的頁面得到更多的URL。         在這篇部落格中主要完成了對頁面中的連結進行解析,並將它們拼成可以訪問的樣子。更多細緻的工作需要在後面進行完善。  

easyui-datagrid獲取到日期格式的資料,在jsp頁面進行格式化。

之前一直在後臺新增一個String型別的date欄位,在後臺進行格式化,前臺展示date欄位。寫得多了感覺麻煩,就找了一個前臺頁面格式化時間的方法。//格式化時間格式 function formattime(value,row,index){ var date = new

開啟springboot中jsp頁面修改後的熱部署

clas 重新 info alt 還要 pri 部署 重新啟動 span 原始的springboot項目修改完jsp頁面之後還要重新啟動項目才能生效,現對jsp頁面進行熱部署, 在application.yml中加入如下配置: 在配置文件中輸入jsp後,選擇第三個,

在servlet中獲取jsp頁面中選中的複選框的值,並其值進行操作。

jsp部分程式碼:<input type="checkbox" name="checkboxs" value="${stuInfo.sid}"/>動態的為複選框賦值servlet程式碼:String[] ids = request.getParameterValu

Struts2 攔截器控制jsp頁面跳轉

源自一個題目: 請編寫一個攔截器,該攔截器可以獲得使用者輸入的使用者名稱這個資料,業務邏輯為逐個判斷使用者名稱中是否包含“你”,“我”,“他”三個資料,如果包含則直接返回輸入頁面,如果不包含則執行至PersonAction。(除程式碼外,要給出攔截器和Action的配置檔案

jsp頁面使用C標籤時間日期進行判斷

不多說,直接上程式碼。 <c:set var="nowDate" value="<%=System.currentTimeMillis()%>"></c:set> <c:choose> <c:whe

jsp頁面,使用Struts2標簽,傳遞和獲取Action類裏的參數,註意事項。<s:a action><s:iterator><s:param>ognl表達式

ram abc 從數據 -- xml文件 struts2標簽 ice 由於 spa 在編寫SSH2項目的時候,除了使用<s:form>表單標簽向Action類跳轉並傳遞參數之外,很更多時候還需要用到<s:a action="XXX.action"

Jsp頁面圖片img標籤使用絕對路徑進行顯示

版權宣告:博主為初學者,大家一起交流學習!讓我們一起進步! https://blog.csdn.net/YuanMxy/article/details/78644378 最近在做一個商城系統,用來鞏固自己所需學的java知識,中間遇到了一個很簡單但有由於自身基礎不牢導致的圖片絕對路徑顯示的問題,

頁面中 全域性變數 的更新(ajax也可以全域性變數 進行更新)

1 2 3 4 5 6 7 8 9 10 11 12 function checkoldpass($pass) {     $.ajax({     &nb

4、頁面元素及方法進行封裝

所謂的POM(Page Object Model)設計模式其實就是把一個頁面當作一個物件,將一個頁面中的所有元素及方法封裝在一個java類中。 下面封裝了3個頁面的元素: 依次開啟看看吧。 1、home_baidu.py # -*- coding:utf-8 -*- from fra

Appium多點觸控-MultiAction頁面進行放大或縮小

在網頁中我們經常使用縮放操作來便利的檢視具體的資訊,在appium中使用MultiAction多點觸控的類來實現 MultiAction是多點觸控的類,可以模擬使用者多點操作。主要包含載入add()和執行perform()兩個方法. MultiAction一般和TouchAction結合使用,故

前端使用JSP進行開發,用AJAX獲取資料,控制返回給前端返回的是JSP頁面,還是JSON資料

一,問題 以前開發的時候,前端使用JSP或許Thyme Leaf來開發。由於是使用AJAX來獲取資料,所以有時會犯糊塗,如何控制給前端返回頁面,還是一個JSON格式的資料。 二,解決方案 2.1 當你需要給前端返回JSON資料時 方案就是:在

SpringMvc 攔截未登入系統的操作進行攔截處理

各類攔截器的傳統寫法案例: 1 在spring-mvc.xml 檔案中新增 攔截器 如下: <!-- 通用攔截器配置 --> <mvc:interceptors>     ...     ...  

Struts2把action中的值傳遞給jsp頁面

第一種情況轉發到jsp (1)對於action的類屬性,直接為其賦值,然後在jsp頁面中使用el表示式取出這個值${類屬性名}。el的預設取值域就是request。 Struts2會將action的所有帶有get,set方法的屬性自動的放入request域中。 (2)對於在action方法中產