権限制御を実現するいくつかの方法


ITプログラマー開発必須-各種資源ダウンロードリスト、史上最も全IT資源、個人コレクション総括!
方式一:struts 1.x
ステップ1:定義.クラスをカスタマイズしてRequestProcessorクラスを継承し、親クラスのpublic void process(HttpServeretRequest request,HttpServeretResponse response)メソッドを書き換える.このメソッドは、ActionServiceletの役割と同様に、要求を処理するコントローラコンポーネントであり、ActionServiceletによって処理要求が呼び出される.すなわち、ActionFormおよびActionに入る前に処理される要求である.次のようになります.
  
package edu.process;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
public class RequestCharacterProcessor extends RequestProcessor {
    @Override
    public void process(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        //response.setContentType("text/html; charset=utf-8");
        // session   user           
       Object value = request.getSession().getAttribute("user");
       //      
       if (value!=null) {
         //         ,               。
              super.process(request, response);
              System.out.println("ddddddddddddddd");//     ,   。
        }else {
            //              
             response.sendRedirect("/login");
        }
        
    }
}    

ステップ2:登録.カスタムRequestProcessorクラスはstrusts-configである必要がある.xmlに登録します.次のようになります.
 struts-config.xml    :
 <controller processorClass="edu.encoding.RequestChinese"></controller>
  :
 <controller>
     <set-property property="processorClass" value="edu.encoding.RequestChinese"/>
 </controller>

注意:
(1)プロセス()メソッドは,FormBeanを埋め込み,Actionのexecute()を呼び出す前に行う.
(2)このような方式の権限制御は、要求文字セット、応答文字セット等の処理に用いることができる.process(request,response);以降のコードは、応答したときのコードです.(検証済みですが、ここには詳細コードは書かれていません).
       (3)struts1.xのこのような権限制御は*をフィルタするしかない.do(actionのurl-patternを*.doと仮定)の要求は、*をフィルタできない.jsp,*.htmlのファイル.
(4)欠陥:すべて*doのリクエストは例外なくプロセッサにリクエストされます.
方法2:フィルタフィルタを定義する
ステップ1:フィルタクラスをカスタマイズする、Filterインタフェースを実現してdoFilter()メソッドを書き換え、doFilter()で権限制御を行い、次のフィルタまたはActionまたはサーブレットに渡すとchainを呼び出す.doFilter(request,response)メソッド、chain.doFilter()後のコードは応答が戻ったときに呼び出されます
package edu.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class PermissionFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("      ...");
		//          ,              Servlet Action
		chain.doFilter(request, response);
		System.out.println("      ...");

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}

ステップ2:web.xmlに登録され、url-patternでは異なるフォーマットのリクエストに対して異なるフィルタを登録できます.
  <filter>
     <filter-name>permission</filter-name>
     <filter-class>edu.filter.PermissionFilter</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>permission</filter-name>
     <url-pattern>*.jsp</url-pattern>
  </filter-mapping>

方法3:struts 2でカスタムブロッカー:参照:Struts 2で権限制御を実現する