Java解決在瀏覽器位址列中輸入url訪問action的問題以及攔截方法過濾的簡易實現
①瀏覽器位址列中直接輸入url訪問action的問題
②過濾不想被攔截的方法
例如對於如下連結:
- http://localhost:8080/absSys/delete.action?id=1
直接在瀏覽器中提交上述地址,delete操作依然能執行!因此,必須對使用者提交的請求進行攔截處理,如果使用者沒有登入,則跳轉至登入頁面。
一、瀏覽器位址列中直接輸入url訪問action的問題
Struts2提供了攔截器,我們編寫自己的攔截器的時候,只需要繼承抽象類AbstractInterceptor,然後override intercept()方法就可以了。
- import java.util.Map;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class LoginInterceptor extends
- private static final long serialVersionUID = 1L;
- public void destroy() {
- System.out.println("Destory");
- }
- public void init() {
- System.out.println("Init");
- }
- /**
- * @return result
- * */
- public String intercept(ActionInvocation invocation) throws
- System.out.println("action執行之前");
- String name = invocation.getInvocationContext().getName();
- System.out.println("請求方法:" + name);
- ActionContext ac = invocation.getInvocationContext();
- Map<String, Object> session = ac.getSession();
- boolean allow = name.equals("infolist") || name.equals("xwgg")
- || name.equals("pxdt") || name.equals("noticethrid")
- || name.equals("gqpx") || name.equals("gp")
- || name.equals("np") || name.equals("sp")
- || name.equals("wypx") || name.equals("zgks")
- || name.equals("shpx") || name.equals("fwxz")
- || name.equals("noticesec") || name.equals("filedown");
- if (name.equals("login") || allow) {
- // 如果使用者想登陸,或者執行的是allow方法則不攔截,使之通過
- // invocation.invoke()繼續執行攔截器後續的處理
- return invocation.invoke();
- } else {
- if (session.isEmpty() || session == null) {
- // 如果session為空,則讓使用者登陸
- return "login";
- } else {
- String userId = session.get("userId").toString();
- if (userId == null) {
- // session不為空,但是session中沒有使用者資訊
- // 讓使用者登陸
- return "login";
- } else {
- // 使用者已經登陸,登陸成功
- return invocation.invoke();
- }
- }
- }
- }
- }
二、過濾不想被攔截的方法
在預設的配置中,是攔截所有的方法,對於部分不需要攔截的方法,則需要進行特殊的處理。
LoginInterceptor類中:
- String name = invocation.getInvocationContext().getName();
這個name是獲取請求的方法,由於,我們對部分方法可能不需要攔截,因此讓其直接繼續執行後續的處理操作。這種常見的情況是,我們前臺首頁的查詢action,我們是不需要攔截的。我們可以將不需要攔截的方法定義在allow中,也可以定義在配置檔案中。本文為了方便起見,定義了一個boolean的變數allow。
- if (name.equals("login") || allow) {
- return invocation.invoke();
- }
invocation.invoke();是繼續執行後續操作。
三、修改Struts.xml配置檔案,加入攔截器配置
Struts.xml配置如下:
- <package name="author" namespace="/author" extends="struts-default">
- <interceptors>
- <interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
- <interceptor-stack name="loginCheck">
- <interceptor-ref name="login"></interceptor-ref>
- <interceptor-ref name="defaultStack"></interceptor-ref>
- </interceptor-stack>
- </interceptors>
- <default-interceptor-ref name="loginCheck"></default-interceptor-ref>
- <global-results>
- <result name="login" type="redirect">/login.jsp</result>
- <result name="illegal" type="redirect">/illegal.jsp</result>
- </global-results>
- </package>
這裡需要說明一下的就是,對於這個攔截器的配置,可以加到需要攔截的package裡面,也可以當度的放在一個package裡面,然後其他的package繼承我們的這個author package即可。
- <package name="User" namespace="/user" extends="struts-default,author">
ps: 同樣也可以在指定的action中進行配置
- <interceptor-ref name="loginCheck"></interceptor-ref>
這個攔截器,但是這對每一個需要攔截的action都需要加入這個配置,對於大量的配置檔案來說是比較繁瑣的,因此我們只需定義一個package配置即可。
另外,對於攔截器方法過濾也可以繼承 MethodFilterInterceptor這個類來實現.
轉載自:http://blog.csdn.net/llhwin2010/article/details/8873034