Servlet3.0下@WebFilter注記設定Filter


Servlet3.0下@WebFilter注記設定Filter
Filter(フィルタ)は、主に要求が到着する前に処理し、要求が終了した後に処理してもよい.チェーン式と同様である.1つの要求は複数のフィルタによってブロックされ、各Filterに順次進み、サーブレットに入るまで放行され、サーブレット処理要求が終了した後、各Filterに戻って後続のコードを実行し続け、先に実行したFilter後に実行される.
よく使われる場所:
  • ユーザ権限フィルタ
  • ログ
  • 文字符号化処理
  • Filterの設定:
  • @WebFilter注記
  • web.xmlでの構成
  • @WebFilter共通プロパティ
    ツールバーの
    を選択します.
    必要かどうか
    説明
    asyncSupported
    boolean
    いいえ
    Filterが非同期モードをサポートするかどうかを指定します
    dispatcherTypes
    DispatcherType[]
    いいえ
    Filterがどの方式のリクエストをフィルタするかを指定します.サポートする属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST;すべてのメソッドをデフォルトでフィルタするリクエスト
    filterName
    String
    いいえ
    Filter名
    initParams
    WebInitParam[]
    いいえ
    構成パラメータ
    displayName
    String
    いいえ
    Filter表示名
    servletNames
    String[]
    いいえ
    どのサーブレットをフィルタするかを指定します
    urlPatterns/value
    String[]
    いいえ
    2つのアトリビュートは同じ役割を果たし、ブロックするパスを指定します.
    ユーザー権限フィルタの例:
    1.方式一,@WebFilter注記方式
    カスタムフィルタjavaxを実現する.servlet.Filterインタフェースは、注釈で構成されています.すべてのリクエストをブロックし、ログインページ、ログイン操作リクエストを放行し、残りのリクエストはログイン後にアクセスする必要があります.同時にパラメータを構成し、行のパスと要求の文字セットを指定します.
    @WebFilter(filterName = "loginFilter", 
    	urlPatterns = "/*", 
    	initParams = {
    			@WebInitParam(name = "loginUI", value = "/home/loginUI"),
    			@WebInitParam(name = "loginProcess", value = "home/login"),
    			@WebInitParam(name = "encoding", value = "utf-8")
    	})
    public class LoginFilter implements Filter {
    	private FilterConfig config;
    	
    	@Override
    	public void init(FilterConfig config) throws ServletException {
    		this.config = config;
    	}
    
    
    	@Override
    	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    			throws IOException, ServletException {
    		//       
    		String loginUI = config.getInitParameter("loginUI");
    		String loginProcess = config.getInitParameter("loginProcess");
    		String encoding = config.getInitParameter("encoding");
    
    
    		HttpServletRequest request = (HttpServletRequest) req;
    		HttpServletResponse response = (HttpServletResponse) res;
    		
    		//         (post      )
    		request.setCharacterEncoding(encoding);
    		
    		//   http://  :     
    		String uri = request.getRequestURI();
    		if (uri.contains(loginUI) || uri.contains(loginProcess)) {
    			//      ,  
    			chain.doFilter(request, response);
    		} else {
    			if (request.getSession().getAttribute("user") == null) {
    				//         
    				response.sendRedirect(request.getContextPath() + loginUI);
    			} else {
    				//     ,  
    				chain.doFilter(request, response);
    			}
    		}
    	}
    	
    	@Override
    	public void destroy() {
    		this.config = null;
    	}
    }

    2.方式二、web.xml方式構成
    Webでxmlファイルの中で配置して、方式の1の中の@WebFilterの注釈を取り除いて、残りのコードは同じです
    
      	loginFilter
      	cn.edu.njit.filter.LoginFilter
      	
      		loginUI
      		/home/loginUI
      	
      	
      		loginProcess
      		home/login
      	
      	
      		encoding
      		utf-8
      	
    
    
      	loginFilter
      	/*
    

    3.注
    (1).Filterとサーブレットは似ていて、属性や構成方式からサーブレットの強化版と理解できる.
    (2).Filterにおける権限のフィルタリング、文字符号化の処理、ログの記録は、各サーブレットにおける重複コードの抽出と見なすことができる.
    (3).文字符号化の処理についてrequest.setCharacterEncoding()はpost方式の要求に有効である.get方式の場合、new String(xxx.getBytes(「iso-8859-1」)、「utf-8」)を使用して処理できます.そうしないと、フォームの中国語が文字化けします.requestを通過するたびにプロキシ方式を用いるもよい.getParameter()時に自動的に符号化処理を行う.