Java解決在瀏覽器地址欄中輸入url訪問action的問題以及攔截方法過濾的簡易實現

對於Struts2、Spring3、Hibernate3集成使用的項目來說,對用戶請求的控制是非常重要的,有些操作需要用戶登錄後才能執行。如果不做任何限制,則action可以直接在瀏覽器中輸入action地址來執行相應的action.本文主要解決的就是

①瀏覽器地址欄中直接輸入url訪問action的問題

②過濾不想被攔截的方法

例如對於如下鏈接:

 


 
  1. http://localhost:8080/absSys/delete.action?id=1

直接在瀏覽器中提交上述地址,delete操作依然能執行!因此,必須對用戶提交的請求進行攔截處理,如果用戶沒有登錄,則跳轉至登錄頁面。

一、瀏覽器地址欄中直接輸入url訪問action的問題

Struts2提供了攔截器,我們編寫自己的攔截器的時候,只需要繼承抽象類AbstractInterceptor,然後override intercept()方法就可以了。


 
  1. import java.util.Map;
  2. import com.opensymphony.xwork2.ActionContext;
  3. import com.opensymphony.xwork2.ActionInvocation;
  4. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  5.  
  6. public class LoginInterceptor extends AbstractInterceptor {
  7.  
  8. private static final long serialVersionUID = 1L;
  9.  
  10. public void destroy() {
  11.  
  12. System.out.println("Destory");
  13. }
  14.  
  15. public void init() {
  16.  
  17. System.out.println("Init");
  18. }
  19.  
  20. /**
  21. * @return result
  22. * */
  23. public String intercept(ActionInvocation invocation) throws Exception {
  24. System.out.println("action執行之前");
  25. String name = invocation.getInvocationContext().getName();
  26. System.out.println("請求方法:" + name);
  27. ActionContext ac = invocation.getInvocationContext();
  28. Map<String, Object> session = ac.getSession();
  29. boolean allow = name.equals("infolist") || name.equals("xwgg")
  30. || name.equals("pxdt") || name.equals("noticethrid")
  31. || name.equals("gqpx") || name.equals("gp")
  32. || name.equals("np") || name.equals("sp")
  33. || name.equals("wypx") || name.equals("zgks")
  34. || name.equals("shpx") || name.equals("fwxz")
  35. || name.equals("noticesec") || name.equals("filedown");
  36. if (name.equals("login") || allow) {
  37. // 如果用戶想登陸,或者執行的是allow方法則不攔截,使之通過
  38. // invocation.invoke()繼續運行攔截器後續的處理
  39.  
  40. return invocation.invoke();
  41.  
  42. } else {
  43. if (session.isEmpty() || session == null) {
  44. // 如果session爲空,則讓用戶登陸
  45. return "login";
  46. } else {
  47. String userId = session.get("userId").toString();
  48. if (userId == null) {
  49. // session不爲空,但是session中沒有用戶信息
  50. // 讓用戶登陸
  51. return "login";
  52. } else {
  53. // 用戶已經登陸,登陸成功
  54. return invocation.invoke();
  55. }
  56. }
  57. }
  58. }
  59. }

 

二、過濾不想被攔截的方法

在默認的配置中,是攔截所有的方法,對於部分不需要攔截的方法,則需要進行特殊的處理。

 

LoginInterceptor類中:

 


 
  1. String name = invocation.getInvocationContext().getName();

 

這個name是獲取請求的方法,由於,我們對部分方法可能不需要攔截,因此讓其直接繼續執行後續的處理操作。這種常見的情況是,我們前臺首頁的查詢action,我們是不需要攔截的。我們可以將不需要攔截的方法定義在allow中,也可以定義在配置文件中。本文爲了方便起見,定義了一個boolean的變量allow。

 


 
  1. if (name.equals("login") || allow) {
  2. return invocation.invoke();
  3. }

invocation.invoke();是繼續執行後續操作。

 

三、修改Struts.xml配置文件,加入攔截器配置

Struts.xml配置如下:

 


 
  1. <package name="author" namespace="/author" extends="struts-default">
  2.  
  3. <interceptors>
  4. <interceptor name="login" class="com.xxx.util.LoginInterceptor"></interceptor>
  5. <interceptor-stack name="loginCheck">
  6. <interceptor-ref name="login"></interceptor-ref>
  7. <interceptor-ref name="defaultStack"></interceptor-ref>
  8. </interceptor-stack>
  9. </interceptors>
  10. <default-interceptor-ref name="loginCheck"></default-interceptor-ref>
  11.  
  12. <global-results>
  13. <result name="login" type="redirect">/login.jsp</result>
  14. <result name="illegal" type="redirect">/illegal.jsp</result>
  15. </global-results>
  16.  
  17. </package>

這裏需要說明一下的就是,對於這個攔截器的配置,可以加到需要攔截的package裏面,也可以當度的放在一個package裏面,然後其他的package繼承我們的這個author package即可。

 


 
  1. <package name="User" namespace="/user" extends="struts-default,author">

 

ps: 同樣也可以在指定的action中進行配置


 
  1. <interceptor-ref name="loginCheck"></interceptor-ref>

這個攔截器,但是這對每一個需要攔截的action都需要加入這個配置,對於大量的配置文件來說是比較繁瑣的,因此我們只需定義一個package配置即可。

另外,對於攔截器方法過濾也可以繼承 MethodFilterInterceptor這個類來實現.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章