javaweb 학습 총화(46)-필터(필터)흔 한 응용
65042 단어 javaweb
설정 매개 변수 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");
모든 브 라 우 저가 위의 세 개의 응답 헤드 를 완전히 지원 할 수 있 는 것 은 아니 므 로 위의 세 개의 응답 헤드 를 동시에 사용 하 는 것 이 좋다.
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 }
이상 은 필터 의 몇 가지 흔 한 응용 장면 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javaweb에서 양식 데이터를 가져오는 다양한 방법Javaweb에서 양식 데이터를 가져오는 몇 가지 방법 1. 키 값이 맞는 형식으로 폼 데이터를 얻는다 getParameter(String name): 키를 통해 value를 반환합니다. getParameterVal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.