struts2攔截器之用戶session判斷
來源:程序員人生 發布時間:2015-04-17 08:37:42 閱讀次數:3297次
幾近每一個J2EE的項目都會觸及用戶模塊,只要觸及到就有用戶登陸登出及其session的1些管理和判斷,我之前也寫過很多關于這方面的代碼,只是寫但沒做總結,今天就做1次簡單的總結,也方便新人學習或鑒戒.好了空話不多說,言回正題.
今天主要是講授的是struts2對session的判斷和攔截.
首先我們在struts的xml配置文件寫入攔截器的配置信息,以下:
<package name="struts2" namespace="/" extends="struts-default">
<!-- 定義1個攔截器 -->
<interceptors>
<!-- 權限攔截器 <interceptor name="authority" class="com.smartsoft.interceptor.AuthorityIterceptor"> </interceptor> -->
<!-- session攔截器-->
<interceptor name="sessionout" class="com.smartsoft.interceptor.SessionIterceptor"></interceptor>
<!-- 攔截器棧 -->
<interceptor-stack name="mystack">
<interceptor-ref name="defaultStack" />
<!-- 權限攔截 <interceptor-ref name="authority" /> -->
<!-- session攔截-->
<interceptor-ref name="sessionout" />
</interceptor-stack>
</interceptors>
<!-- 定義全局Result -->
<global-results>
<!-- 當返回login視圖名時,轉入/login.jsp頁面 -->
<result name="toLogin">/login.jsp</result>
</global-results>
</package>
代碼所示,我定義了1個名字為struts2的package,里面定義了攔截器interceptors和全局視圖的跳轉,在攔截器中定義了1個sessionout,便是我們的session判斷功能,他指向class以下:
package com.smartsoft.interceptor;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.smartsoft.model.User;
import com.smartsoft.util.Constants;
public class SessionIterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
//獲得要求的URL
String url = ServletActionContext.getRequest().getRequestURL().toString();
HttpServletResponse response=ServletActionContext.getResponse();
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires",0);
User loginUser = null;
//對登錄與注銷要求直接放行,不予攔截
if (url.indexOf("login")!=⑴ || url.indexOf("logout")!=⑴){
return actionInvocation.invoke();
}
else{
//驗證Session是不是過期
if(!ServletActionContext.getRequest().isRequestedSessionIdValid()){
//session過期,轉向session過期提示頁,終究跳轉至登錄頁面
System.out.println("session過期");
return "toLogin";
}
else{
loginUser = (User)ServletActionContext.getRequest().getSession().getAttribute(Constants.USER_SESSION);
//驗證是不是已登錄
if (loginUser==null){
//還沒有登錄,跳轉至登錄頁面
return "toLogin";
}else{
return actionInvocation.invoke();
}
}
}
}
}
以上代碼邏輯比較簡單,獲得當前session的用戶,并判斷他是不是存在,以此作為根據判斷他是不是在登陸狀態,是則放行,否則調到實現定義好的登錄界面
以上只是攔截器的整定義進程,何如才能把他應用到我們需要的連接上呢?具體還需要在每一個struts的action上加上以下配置才可以,比如
<package name="db" namespace="" extends="struts2">
<action name="index" method="index" class="com.smartsoft.action.IndexAction">
<result>/index.jsp</result>
<interceptor-ref name="mystack" />
</action>
<action name="login" method="login " class="com.smartsoft.action.IndexAction">
<result type="redirect">index</result>
<interceptor-ref name="mystack" />
</action>
</package>
比如這是我定義的1個登錄的xml配置,由于我不是與攔截器寫在同1package下的,所以,但我這里需要用到之前的攔截器,需要把當前另起的package繼承攔截器所屬的package,具體代碼在packge的extends填入攔截器的package的name就好了,繼承1說罷了,然后再每一個需要攔截判斷的action里加上這句配置就好了,如果是直接寫在攔截器的package就直接用就好了,不存在繼承,呵呵
<interceptor-ref name="mystack" />
好了,就說到這里吧,不明白的同學或,有更好的建議可以給我留言,感謝瀏覽本篇文章,轉發請標明出處,謝謝
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈