JavaEE学習ノートのサーブレット/JSP(5)

13370 ワード

サーブレットでよく使用されるフィルタをいくつか示します.
一、文字コードのフィルタ
/** *               HTTP           ,       encoding          ,    HtmlForm          */
public class CharacterEncodingFilter implements Filter {

    private FilterConfig config = null;
    private String defaultCharset = "utf-8";

    public CharacterEncodingFilter() {
        // TODO Auto-generated constructor stub
    }

    /** * @see Filter#destroy() */
    public void destroy() {
        this.config = null;
        this.defaultCharset = null;
    }

    /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        String charset = config.getInitParameter("encoding");

        if (charset == null) {
            charset = defaultCharset;
        }

        request.setCharacterEncoding(charset);
        //    response      ,  servlet      ,
        //     jsp  ,    jsp        

        request.setCharacterEncoding(charset);
        resp.setContentType("text/html;charset=" + charset);
        chain.doFilter(req, resp);
    }

    /** * @see Filter#init(FilterConfig) */
    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;
    }
}

web.xml
 <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>com.briup.day03.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

二、すべての動的ページをキャッシュするフィルタを禁止する
a)3つのHTTP応答ヘッダフィールドは、ブラウザが現在のページをキャッシュすることを禁止することができ、それらのサーブレットにおけるサンプルコードは以下の通りである.
         response.setDateHeader("Expires",-1);

         response.setHeader("Cache-Control","no-cache"); 

         response.setHeader("Pragma","no-cache"); 

b)すべてのブラウザが上記の3つの応答ヘッダを完全にサポートできるわけではないので、上記の3つの応答ヘッダを同時に使用することが望ましい.
c)Expiresデータヘッダ:値はGMT時間値、値は-1ブラウザがページをキャッシュしないことを指す
d)Cache-Control応答ヘッダには2つの共通値がある.
         no-cachemax-age:xxx        xxx 
/** *     Browser           */
public class NoCacheFilter implements Filter {

    public NoCacheFilter() {

    }

    public void destroy() {

    }

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        response.setDateHeader("expires", -1);
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

web.xml
<filter>
    <filter-name>noCacheFilter</filter-name>
    <filter-class>com.briup.day03.NoCacheFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>noCacheFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>noCacheFilter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

複数のfilter-mappingを設定して、異なるファイルタイプをマッピングできます.
テスト:
フォーム・データをコミットし、戻ってフォーム内のデータがまだ存在するかどうかを確認します.
三、ユーザーがログインしていないことを防止するフィルタ
私たちはよくこの機能を使うかもしれません.例えば、ユーザーがログインしてバックグラウンドの操作ページにアクセスしないことを望んでいません.また、このような不正アクセスはシステムを極めて安全ではありません.そのため、私たちは常にログインして他のページにアクセスすることを許可する必要があります.いいえ、ログインページだけが表示されます.もちろん、私の考えは:
1つは、jspページでsessionの判断を行い、そのユーザのsessionが存在しない場合はログインページにジャンプし、そうでなければjspページコードを実行しますが、このような論理も簡単であることがわかりますが、非常に面倒で、多くのjspがあれば、複数の判定を書く必要があります.
もう1つは、フィルタを利用してページにアクセスする際にフィルタ検証を行い、そのユーザーセッションが存在する場合はそのページにアクセスし、そうでない場合はログインページにジャンプしてログインし、セッションを保存して他のページにアクセスする
public class LoginFilter implements Filter {

    public static final String login_page = "/test/admin/index.jsp";
    public static final String logout_page = "/test/admin/Public/login.jsp";

    @Override
    public void destroy() {
        System.out.println("OneFilter   。。。");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String requestURI = request.getRequestURI();
        String cxtPath = request.getContextPath();
        //               
        String targerURL = requestURI.substring(cxtPath.length());
        HttpSession session = request.getSession(false);
        //         ,            
        if (!("/admin/Public/login.jsp".equals(targerURL))) {
            //        ,     ,           session        ,
            if(session == null || session.getAttribute("admin") == null){
                response.sendRedirect(logout_page);
                return;
            }else {
                //      ,        ,     ,          
                chain.doFilter(request, response);
                return;
            }
        }else {
            //               ,       
            chain.doFilter(request, response);
            return;
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("OneFilter    。。。");
    }
}

web.xml
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.test.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    //         jsp       ,     
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>