javaweb 학습 총화(46)-필터(필터)흔 한 응용

65042 단어 javaweb
1.전체 사이트 문자 인 코딩 통일
설정 매개 변수 charset 를 통 해 Html Form 요청 매개 변수의 중국어 문 제 를 처리 하기 위해 어떤 문자 인 코딩 을 사용 하 는 지 알려 줍 니 다.
 1 package me.gacl.web.filter;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.Filter;
 5 import javax.servlet.FilterChain;
 6 import javax.servlet.FilterConfig;
 7 import javax.servlet.ServletException;
 8 import javax.servlet.ServletRequest;
 9 import javax.servlet.ServletResponse;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletRequestWrapper;
12 import javax.servlet.http.HttpServletResponse;
13 
14 /**
15 * @ClassName: CharacterEncodingFilter
16 * @Description:                 
17 * @author:     
18 * @date: 2014-8-31   11:09:37
19 *
20 */ 
21 public class CharacterEncodingFilter implements Filter {
22 
23     private FilterConfig filterConfig = null;
24     //         
25     private String defaultCharset = "UTF-8";
26 
27     public void doFilter(ServletRequest req, ServletResponse resp,
28             FilterChain chain) throws IOException, ServletException {
29         
30         HttpServletRequest request = (HttpServletRequest) req;
31         HttpServletResponse response = (HttpServletResponse) resp;
32         String charset = filterConfig.getInitParameter("charset");
33         if(charset==null){
34             charset = defaultCharset;
35         }
36         request.setCharacterEncoding(charset);
37         response.setCharacterEncoding(charset);
38         response.setContentType("text/html;charset="+charset);
39         
40         MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(request);
41         chain.doFilter(requestWrapper, response);
42     }
43 
44     public void init(FilterConfig filterConfig) throws ServletException {
45         //             
46         this.filterConfig = filterConfig;
47     }
48     
49     public void destroy() {
50 
51     }
52 }
53 
54 /*
55 1.              
56 2、             
57 3、       ,       
58 4、         
59 5、         ,         (    )   
60  */
61  
62 class MyCharacterEncodingRequest extends HttpServletRequestWrapper{
63     
64     private HttpServletRequest request;
65     public MyCharacterEncodingRequest(HttpServletRequest request) {
66         super(request);
67         this.request = request;
68     }
69     /*   getParameter  
70      * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
71      */
72     @Override
73     public String getParameter(String name) {
74         
75         try{
76             //      
77             String value= this.request.getParameter(name);
78             if(value==null){
79                 return null;
80             }
81             //     get       ,          
82             if(!this.request.getMethod().equalsIgnoreCase("get")) {
83                 return value;
84             }else{
85                 //    get       ,             
86                 value = new String(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding());
87                 return value;
88             }
89         }catch (Exception e) {
90             throw new RuntimeException(e);
91         }
92     }
93 }

웹.xml 파일 의 설정 은 다음 과 같 습 니 다.
 1  <filter>
 2       <filter-name>CharacterEncodingFilter</filter-name>
 3       <filter-class>me.gacl.web.filter.CharacterEncodingFilter</filter-class>
 4       <init-param>
 5           <param-name>charset</param-name>
 6           <param-value>UTF-8</param-value>
 7       </init-param>
 8   </filter>
 9   
10   <filter-mapping>
11       <filter-name>CharacterEncodingFilter</filter-name>
12       <url-pattern>/*</url-pattern>
13   </filter-mapping>

2.브 라 우 저 캐 시 모든 동적 페이지 금지
3 개의 HTTP 응답 헤더 필드 는 현재 페이지 의 브 라 우 저 캐 시 를 금지 할 수 있 습 니 다.Servlet 에 있 는 예제 코드 는 다음 과 같 습 니 다.
1 response.setDateHeader("Expires",-1);
2 response.setHeader("Cache-Control","no-cache");
3 response.setHeader("Pragma","no-cache"); 

모든 브 라 우 저가 위의 세 개의 응답 헤드 를 완전히 지원 할 수 있 는 것 은 아니 므 로 위의 세 개의 응답 헤드 를 동시에 사용 하 는 것 이 좋다.
  • Expires 데이터 헤더:값 은 GMT 시간 값 입 니 다.-1 은 브 라 우 저가 페이지 를 캐 시 하지 않 는 것 을 말 합 니 다
  • Cache-Control 응답 헤드 는 두 가지 상용 값 이 있 습 니 다4.567917.no-cache 는 브 라 우 저가 현재 페이지 를 캐 시 하지 않 는 것 을 가리킨다
    max-age:xxx 는 브 라 우 저 캐 시 페이지 xxx 초 를 말 합 니 다
     1 package me.gacl.web.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 
    14 /**
    15 * @ClassName: NoCacheFilter
    16 * @Description:              
    17 * @author:     
    18 * @date: 2014-8-31   11:25:40
    19 *
    20 */ 
    21 public class NoCacheFilter implements Filter {
    22 
    23 
    24     public void doFilter(ServletRequest req, ServletResponse resp,
    25             FilterChain chain) throws IOException, ServletException {
    26         // ServletRequest   HttpServletRequest
    27         HttpServletRequest request = (HttpServletRequest) req;
    28         // ServletResponse   HttpServletResponse
    29         HttpServletResponse response = (HttpServletResponse) resp;
    30         //             
    31         response.setDateHeader("Expires", -1);
    32         response.setHeader("Cache-Control", "no-cache");
    33         response.setHeader("Pragma", "no-cache");
    34         
    35         chain.doFilter(request, response);
    36     }
    37 
    38     public void init(FilterConfig filterConfig) throws ServletException {
    39 
    40     }
    41     
    42     public void destroy() {
    43         
    44     }
    45 }

    웹.xml 파일 의 설정 은 다음 과 같 습 니 다.
     1   <filter>
     2       <filter-name>NoCacheFilter</filter-name>
     3       <filter-class>me.gacl.web.filter.NoCacheFilter</filter-class>
     4   </filter>
     5   
     6   <filter-mapping>
     7       <filter-name>NoCacheFilter</filter-name>
     8         <!--   Jsp  -->
     9       <servlet-name>*.jsp</servlet-name>
    10   </filter-mapping>

    3.브 라 우 저 캐 시 페이지 의 정적 자원 제어
    일부 동적 페이지 에 서 는 페이지 효 과 를 수식 하기 위해 그림 이나 css 파일 을 참조 합 니 다.이 그림 과 css 파일 은 항상 변 하지 않 기 때문에 서버 의 압력 을 줄 이기 위해 filter 를 사용 하여 브 라 우 저 캐 시 를 제어 하여 서버 의 성능 을 향상 시 킬 수 있 습 니 다.
     1 package me.gacl.web.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 
    14 /**
    15 * @ClassName: CacheFilter
    16 * @Description:      filter
    17 * @author:     
    18 * @date: 2014-9-1   9:39:38
    19 *
    20 */ 
    21 public class CacheFilter implements Filter {
    22 
    23     private FilterConfig filterConfig;
    24 
    25     public void doFilter(ServletRequest req, ServletResponse resp,
    26             FilterChain chain) throws IOException, ServletException {
    27     
    28         HttpServletRequest request = (HttpServletRequest) req;
    29         HttpServletResponse response = (HttpServletResponse) resp;
    30         
    31         //1.          
    32         String uri = request.getRequestURI(); 
    33         
    34         //2.              
    35         String ext = uri.substring(uri.lastIndexOf(".")+1);
    36         
    37         //           
    38         String time = filterConfig.getInitParameter(ext);
    39         if(time!=null){
    40             long t = Long.parseLong(time)*3600*1000;
    41             //    
    42             response.setDateHeader("expires", System.currentTimeMillis() + t);
    43         }
    44         
    45         chain.doFilter(request, response);
    46 
    47     }
    48 
    49     public void init(FilterConfig filterConfig) throws ServletException {
    50         this.filterConfig = filterConfig;
    51     }
    52     
    53     public void destroy() {
    54         
    55     }
    56 }

    웹.xml 파일 의 설정 은 다음 과 같 습 니 다.
     1  <!--         -->
     2    <filter>
     3       <filter-name>CacheFilter</filter-name>
     4       <filter-class>me.gacl.web.filter.CacheFilter</filter-class>
     5        <!--       web        ,       -->
     6       <init-param>
     7           <param-name>css</param-name>
     8           <param-value>4</param-value>
     9       </init-param>
    10       <init-param>
    11           <param-name>jpg</param-name>
    12           <param-value>1</param-value>
    13       </init-param>
    14       <init-param>
    15           <param-name>js</param-name>
    16           <param-value>4</param-value>
    17       </init-param>
    18       <init-param>
    19           <param-name>png</param-name>
    20           <param-value>4</param-value>
    21       </init-param>
    22   </filter>
    23   <!--       web     -->
    24   <filter-mapping>
    25       <filter-name>CacheFilter</filter-name>
    26       <url-pattern>*.jpg</url-pattern>
    27   </filter-mapping>
    28   
    29   <filter-mapping>
    30       <filter-name>CacheFilter</filter-name>
    31       <url-pattern>*.css</url-pattern>
    32   </filter-mapping>
    33   
    34   <filter-mapping>
    35       <filter-name>CacheFilter</filter-name>
    36       <url-pattern>*.js</url-pattern>
    37   </filter-mapping>
    38    <filter-mapping>
    39       <filter-name>CacheFilter</filter-name>
    40       <url-pattern>*.png</url-pattern>
    41   </filter-mapping>

    4.사용자 자동 로그 인 실현
    사고방식 은 이렇다.
    1.사용자 가 로그 인 에 성공 한 후에 user 라 는 쿠키 를 클 라 이언 트 에 보 냅 니 다.쿠키 의 값 은 사용자 이름과 md5 암호 화 된 비밀번호 입 니 다.2.AutoLoginFilter 를 만 듭 니 다.이 filter 는 사용자 가 user 라 는 쿠키 를 가지 고 있 는 지 확인 합 니 다.있 으 면 dao 를 호출 하여 쿠키 의 사용자 이름과 비밀번호 가 데이터베이스 와 일치 하 는 지,일치 하 는 지 확인 하고 session 에 user 대상(즉,사용자 로그 인 태그)을 저장 하여 프로그램 이 자동 으로 로그 인 합 니 다.
    핵심 코드 는 다음 과 같 습 니 다.
    사용자 로그 인 처리 컨트롤 러:LoginServlet
     1 package me.gacl.web.controller;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 import me.gacl.dao.UserDao;
    12 import me.gacl.domain.User;
    13 import me.gacl.util.WebUtils;
    14 
    15 public class LoginServlet extends HttpServlet {
    16 
    17     public void doGet(HttpServletRequest request, HttpServletResponse response)
    18             throws ServletException, IOException {
    19 
    20         String username = request.getParameter("username");
    21         String password = request.getParameter("password");
    22         
    23         UserDao dao = new UserDao();
    24         User user = dao.find(username, password);
    25         if(user==null){
    26             request.setAttribute("message", "        !!");
    27             request.getRequestDispatcher("/message.jsp").forward(request, response);
    28             return;
    29         }
    30         request.getSession().setAttribute("user", user);
    31         //      cookie           
    32         sendAutoLoginCookie(request,response,user);
    33         request.getRequestDispatcher("/index.jsp").forward(request, response);
    34     }
    35 
    36     /**
    37     * @Method: sendAutoLoginCookie
    38     * @Description:       cookie       
    39     * @Anthor:    
    40     *
    41     * @param request
    42     * @param response
    43     * @param user
    44     */ 
    45     private void sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) {
    46         if (request.getParameter("logintime")!=null) {
    47             int logintime = Integer.parseInt(request.getParameter("logintime"));
    48             //  cookie,cookie    autologin,             ,          .    ,    md5    
    49             Cookie cookie = new Cookie("autologin",user.getUsername() + "." + WebUtils.md5(user.getPassword()));
    50             //  cookie    
    51             cookie.setMaxAge(logintime);
    52             //  cookie     
    53             cookie.setPath(request.getContextPath());
    54             // cookie         
    55             response.addCookie(cookie);
    56         }
    57     }
    58     
    59     public void doPost(HttpServletRequest request, HttpServletResponse response)
    60             throws ServletException, IOException {
    61 
    62         doGet(request, response);
    63     }
    64 
    65 }

    사용자 자동 로그 인 처리 필터:AutoLoginFilter
     1 package me.gacl.web.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.Cookie;
    12 import javax.servlet.http.HttpServletRequest;
    13 import javax.servlet.http.HttpServletResponse;
    14 
    15 import me.gacl.dao.UserDao;
    16 import me.gacl.domain.User;
    17 import me.gacl.util.WebUtils;
    18 
    19 public class AutoLoginFilter implements Filter {
    20 
    21     public void doFilter(ServletRequest req, ServletResponse resp,
    22             FilterChain chain) throws IOException, ServletException {
    23         
    24         HttpServletRequest request = (HttpServletRequest) req;
    25         HttpServletResponse response = (HttpServletResponse) resp;
    26         //       ,   chain.doFilter(request, response)  
    27         if(request.getSession().getAttribute("user")!=null){
    28             chain.doFilter(request, response);
    29             return;
    30         }
    31         
    32         //1.        authlogin cookie
    33         String value = null;
    34         Cookie cookies[] = request.getCookies();
    35         for(int i=0;cookies!=null && i<cookies.length;i++){
    36             if(cookies[i].getName().equals("autologin")){
    37                 value = cookies[i].getValue();
    38             }
    39         }
    40         
    41         //2.   cookie         
    42         if(value!=null){
    43             String username = value.split("\\.")[0];
    44             String password = value.split("\\.")[1];
    45             
    46             //3.  dao         
    47             UserDao dao = new UserDao();
    48             User user = dao.find(username);
    49             String dbpassword = user.getPassword();
    50             
    51             //4.        md5               ,        
    52             if(password.equals(WebUtils.md5(dbpassword))){
    53                 request.getSession().setAttribute("user", user);
    54             }
    55         }
    56         
    57         chain.doFilter(request, response);
    58     }
    59     
    60     public void destroy() {
    61         
    62     }
    63 
    64     public void init(FilterConfig filterConfig) throws ServletException {
    65 
    66     }
    67 }

    자동 로그 인 을 취소 하려 면 사용자 가 로그아웃 할 때 자동 로그 인 쿠키 를 삭제 할 수 있 습 니 다.핵심 코드 는 다음 과 같 습 니 다.
     1 package me.gacl.web.controller;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.ServletException;
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class CancelAutoLoginServlet extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         //     session  user
    16         request.getSession().removeAttribute("user");
    17         //       cookie
    18         removeAutoLoginCookie(request,response);
    19         //            
    20         request.getRequestDispatcher("/login.jsp").forward(request, response);
    21     }
    22 
    23     /**
    24     * @Method: removeAutoLoginCookie
    25     * @Description:       cookie,
    26     *     JavaWeb   cookie          cookie,    cookie     cookie  ,
    27     *           cookie cookie       0,         cookie       
    28     * @Anthor:    
    29     *
    30     * @param request
    31     * @param response
    32     */ 
    33     private void removeAutoLoginCookie(HttpServletRequest request, HttpServletResponse response) {
    34         //       autologin cookie
    35         Cookie cookie = new Cookie("autologin","");
    36          // cookie       0,        cookie
    37         cookie.setMaxAge(0);
    38         //      cookie path
    39         cookie.setPath(request.getContextPath());
    40         response.addCookie(cookie);
    41     }
    42     
    43     public void doPost(HttpServletRequest request, HttpServletResponse response)
    44             throws ServletException, IOException {
    45         doGet(request, response);
    46     }
    47 }

    이상 은 필터 의 몇 가지 흔 한 응용 장면 입 니 다.

    좋은 웹페이지 즐겨찾기