struts2攔截器之用戶session判斷
來源:程序員人生 發(fā)布時(shí)間:2015-04-17 08:37:42 閱讀次數(shù):3305次
幾近每一個(gè)J2EE的項(xiàng)目都會(huì)觸及用戶模塊,只要觸及到就有用戶登陸登出及其session的1些管理和判斷,我之前也寫過很多關(guān)于這方面的代碼,只是寫但沒做總結(jié),今天就做1次簡(jiǎn)單的總結(jié),也方便新人學(xué)習(xí)或鑒戒.好了空話不多說,言回正題.
今天主要是講授的是struts2對(duì)session的判斷和攔截.
首先我們?cè)趕truts的xml配置文件寫入攔截器的配置信息,以下:
<package name="struts2" namespace="/" extends="struts-default">
<!-- 定義1個(gè)攔截器 -->
<interceptors>
<!-- 權(quán)限攔截器 <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" />
<!-- 權(quán)限攔截 <interceptor-ref name="authority" /> -->
<!-- session攔截-->
<interceptor-ref name="sessionout" />
</interceptor-stack>
</interceptors>
<!-- 定義全局Result -->
<global-results>
<!-- 當(dāng)返回login視圖名時(shí),轉(zhuǎn)入/login.jsp頁(yè)面 -->
<result name="toLogin">/login.jsp</result>
</global-results>
</package>
代碼所示,我定義了1個(gè)名字為struts2的package,里面定義了攔截器interceptors和全局視圖的跳轉(zhuǎn),在攔截器中定義了1個(gè)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;
//對(duì)登錄與注銷要求直接放行,不予攔截
if (url.indexOf("login")!=⑴ || url.indexOf("logout")!=⑴){
return actionInvocation.invoke();
}
else{
//驗(yàn)證Session是不是過期
if(!ServletActionContext.getRequest().isRequestedSessionIdValid()){
//session過期,轉(zhuǎn)向session過期提示頁(yè),終究跳轉(zhuǎn)至登錄頁(yè)面
System.out.println("session過期");
return "toLogin";
}
else{
loginUser = (User)ServletActionContext.getRequest().getSession().getAttribute(Constants.USER_SESSION);
//驗(yàn)證是不是已登錄
if (loginUser==null){
//還沒有登錄,跳轉(zhuǎn)至登錄頁(yè)面
return "toLogin";
}else{
return actionInvocation.invoke();
}
}
}
}
}
以上代碼邏輯比較簡(jiǎn)單,獲得當(dāng)前session的用戶,并判斷他是不是存在,以此作為根據(jù)判斷他是不是在登陸狀態(tài),是則放行,否則調(diào)到實(shí)現(xiàn)定義好的登錄界面
以上只是攔截器的整定義進(jìn)程,何如才能把他應(yīng)用到我們需要的連接上呢?具體還需要在每一個(gè)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個(gè)登錄的xml配置,由于我不是與攔截器寫在同1package下的,所以,但我這里需要用到之前的攔截器,需要把當(dāng)前另起的package繼承攔截器所屬的package,具體代碼在packge的extends填入攔截器的package的name就好了,繼承1說罷了,然后再每一個(gè)需要攔截判斷的action里加上這句配置就好了,如果是直接寫在攔截器的package就直接用就好了,不存在繼承,呵呵
<interceptor-ref name="mystack" />
好了,就說到這里吧,不明白的同學(xué)或,有更好的建議可以給我留言,感謝瀏覽本篇文章,轉(zhuǎn)發(fā)請(qǐng)標(biāo)明出處,謝謝
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)