JavaWeb 37の詳細分析--フィルタFilterの典型的な応用

56527 ワード

一、統一全局文字符号化
構成パラメータcharsetによって、Html Form要求パラメータの中国語問題を処理するためにどの文字符号化を使用するかを指定します.
package me.gacl.web.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

/** * @ClassName: CharacterEncodingFilter * @Description:                  * @author:      * @date: 2014-8-31   11:09:37 * */ 
public class CharacterEncodingFilter implements Filter {

    private FilterConfig filterConfig = null;
    //         
    private String defaultCharset = "UTF-8";

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String charset = filterConfig.getInitParameter("charset");
        if(charset==null){
            charset = defaultCharset;
        }
        request.setCharacterEncoding(charset);
        response.setCharacterEncoding(charset);
        response.setContentType("text/html;charset="+charset);

        MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(request);
        chain.doFilter(requestWrapper, response);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        //             
        this.filterConfig = filterConfig;
    }

    public void destroy() {

    }
}

/* 1.              2、              3、       ,        4、          5、         ,         (    )    */

class MyCharacterEncodingRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;
    public MyCharacterEncodingRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    /*   getParameter   * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String) */
    @Override
    public String getParameter(String name) {

        try{
            //      
            String value= this.request.getParameter(name);
            if(value==null){
                return null;
            }
            //     get       ,          
            if(!this.request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }else{
                //    get       ,             
                value = new String(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding());
                return value;
            }
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Web.xmlファイルの構成は次のとおりです.
<filter>
      <filter-name>CharacterEncodingFilter</filter-name>
      <filter-class>me.gacl.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
          <param-name>charset</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </filter>

  <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

二、ブラウザがすべての動的ページをキャッシュすることを禁止する
3つのHTTPレスポンスヘッダフィールドでは、ブラウザが現在のページをキャッシュすることを禁止できます.サーブレットのサンプルコードは次のとおりです.
response.setDateHeader("Expires",-1);
 response.setHeader("Cache-Control","no-cache");
 response.setHeader("Pragma","no-cache"); 

すべてのブラウザが上記の3つの応答ヘッダを完全にサポートできるわけではないので、上記の3つの応答ヘッダを同時に使用することが望ましい.
  • Expiresデータヘッダ:値はGMT時間値、-1はブラウザがページ
  • をキャッシュしないことを指す.
  • Cache-control応答ヘッダには2つの共通値があります.
  • no-cacheとは、ブラウザが現在のページをキャッシュしないことを意味します.
  • max-age:xxxブラウザキャッシュページxxx秒を指します.
  • package me.gacl.web.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;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /** * @ClassName: NoCacheFilter * @Description:               * @author:      * @date: 2014-8-31   11:25:40 * */ 
    public class NoCacheFilter implements Filter {
    
    
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException {
            // ServletRequest   HttpServletRequest
            HttpServletRequest request = (HttpServletRequest) req;
            // ServletResponse   HttpServletResponse
            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 filterConfig) throws ServletException {
    
        }
    
        public void destroy() {
    
        }
    }

    Web.xmlファイルの構成は次のとおりです.
    <filter>
          <filter-name>NoCacheFilter</filter-name>
          <filter-class>me.gacl.web.filter.NoCacheFilter</filter-class>
      </filter>
    
      <filter-mapping>
          <filter-name>NoCacheFilter</filter-name>
            <!--   Jsp  -->
          <servlet-name>*.jsp</servlet-name>
      </filter-mapping>

    三、ブラウザキャッシュページの静的資源を制御する
    一部のダイナミックページでは、ページ効果を修飾するためにいくつかのピクチャまたはcssファイルが参照されています.これらのピクチャとcssファイルは常に変化しません.そのため、サーバの圧力を軽減するために、filter制御ブラウザを使用してこれらのファイルをキャッシュし、サーバのパフォーマンスを向上させることができます.
    package me.gacl.web.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;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /** * @ClassName: CacheFilter * @Description:      filter * @author:      * @date: 2014-9-1   9:39:38 * */ 
    public class CacheFilter implements Filter {
    
        private FilterConfig filterConfig;
    
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
    
            //1.          
            String uri = request.getRequestURI(); 
    
            //2.              
            String ext = uri.substring(uri.lastIndexOf(".")+1);
    
            //           
            String time = filterConfig.getInitParameter(ext);
            if(time!=null){
                long t = Long.parseLong(time)*3600*1000;
                //    
                response.setDateHeader("expires", System.currentTimeMillis() + t);
            }
    
            chain.doFilter(request, response);
    
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
        }
    
        public void destroy() {
    
        }
    }

    Web.xmlファイルの構成は次のとおりです.
    <!--         -->
       <filter>
          <filter-name>CacheFilter</filter-name>
          <filter-class>me.gacl.web.filter.CacheFilter</filter-class>
           <!--       web        ,       -->
          <init-param>
              <param-name>css</param-name>
              <param-value>4</param-value>
          </init-param>
          <init-param>
              <param-name>jpg</param-name>
              <param-value>1</param-value>
          </init-param>
          <init-param>
              <param-name>js</param-name>
              <param-value>4</param-value>
          </init-param>
          <init-param>
              <param-name>png</param-name>
              <param-value>4</param-value>
          </init-param>
      </filter>
      <!--       web     -->
      <filter-mapping>
          <filter-name>CacheFilter</filter-name>
          <url-pattern>*.jpg</url-pattern>
      </filter-mapping>
    
      <filter-mapping>
          <filter-name>CacheFilter</filter-name>
          <url-pattern>*.css</url-pattern>
      </filter-mapping>
    
      <filter-mapping>
          <filter-name>CacheFilter</filter-name>
          <url-pattern>*.js</url-pattern>
      </filter-mapping>
       <filter-mapping>
          <filter-name>CacheFilter</filter-name>
          <url-pattern>*.png</url-pattern>
      </filter-mapping>

    四、ユーザーの自動登録を実現する
    考え方はこうです.
    1、ユーザー登録に成功した後、userという名前のクッキーをクライアントに送信し、クッキーの値はユーザー名とmd 5暗号化されたパスワードである.2、AutoLoginFilterを作成し、このfilterはユーザーがuserという名前のクッキーを持っているかどうかをチェックし、ある場合はdaoを呼び出してクッキーのユーザー名とパスワードがデータベースと一致しているかどうかをクエリーし、一致するとsessionにuserオブジェクト(すなわちユーザーログインフラグ)を格納し、プログラムの自動ログインを完了する.
    コアコードは次のとおりです.
    ユーザーログイン処理コントローラ:LoginService
    package me.gacl.web.controller;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import me.gacl.dao.UserDao;
    import me.gacl.domain.User;
    import me.gacl.util.WebUtils;
    
    public class LoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            String username = request.getParameter("username");
            String password = request.getParameter("password");
    
            UserDao dao = new UserDao();
            User user = dao.find(username, password);
            if(user==null){
                request.setAttribute("message", "        !!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
            request.getSession().setAttribute("user", user);
            //      cookie           
            sendAutoLoginCookie(request,response,user);
            request.getRequestDispatcher("/index.jsp").forward(request, response);
        }
    
        /** * @Method: sendAutoLoginCookie * @Description:       cookie        * @Anthor:     * * @param request * @param response * @param user */ 
        private void sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) {
            if (request.getParameter("logintime")!=null) {
                int logintime = Integer.parseInt(request.getParameter("logintime"));
                //  cookie,cookie    autologin,             ,          .    ,    md5    
                Cookie cookie = new Cookie("autologin",user.getUsername() + "." + WebUtils.md5(user.getPassword()));
                //  cookie    
                cookie.setMaxAge(logintime);
                //  cookie     
                cookie.setPath(request.getContextPath());
                // cookie         
                response.addCookie(cookie);
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            doGet(request, response);
        }
    
    }

    ユーザーの自動ログインを処理するフィルタ:AutoLoginFilter
    package me.gacl.web.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;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import me.gacl.dao.UserDao;
    import me.gacl.domain.User;
    import me.gacl.util.WebUtils;
    
    public class AutoLoginFilter implements Filter {
    
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            //       ,   chain.doFilter(request, response)  
            if(request.getSession().getAttribute("user")!=null){
                chain.doFilter(request, response);
                return;
            }
    
            //1.        authlogin cookie
            String value = null;
            Cookie cookies[] = request.getCookies();
            for(int i=0;cookies!=null && i<cookies.length;i++){
                if(cookies[i].getName().equals("autologin")){
                    value = cookies[i].getValue();
                }
            }
    
            //2.   cookie         
            if(value!=null){
                String username = value.split("\\.")[0];
                String password = value.split("\\.")[1];
    
                //3.  dao         
                UserDao dao = new UserDao();
                User user = dao.find(username);
                String dbpassword = user.getPassword();
    
                //4.        md5               ,        
                if(password.equals(WebUtils.md5(dbpassword))){
                    request.getSession().setAttribute("user", user);
                }
            }
    
            chain.doFilter(request, response);
        }
    
        public void destroy() {
    
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    }

    自動ログインをキャンセルする場合は、ユーザーがログアウトしたときに自動ログインクッキーを削除できます.コアコードは次のとおりです.
    package me.gacl.web.controller;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CancelAutoLoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //     session  user
            request.getSession().removeAttribute("user");
            //       cookie
            removeAutoLoginCookie(request,response);
            //            
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    
        /** * @Method: removeAutoLoginCookie * @Description:       cookie, * JavaWeb   cookie          cookie,    cookie     cookie  , *       cookie cookie       0,         cookie        * @Anthor:     * * @param request * @param response */ 
        private void removeAutoLoginCookie(HttpServletRequest request, HttpServletResponse response) {
            //       autologin cookie
            Cookie cookie = new Cookie("autologin","");
             // cookie       0,        cookie
            cookie.setMaxAge(0);
            //      cookie path
            cookie.setPath(request.getContextPath());
            response.addCookie(cookie);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    }

    以上がフィルタの一般的なアプリケーションシーンです.