javaweb-ServletフィルタFilterを簡単に実現します。

4483 ワード

1.簡単に言えば、javax.servlet.Filterフィルタを利用して、sessionが失効した時、判定をして指定ページに戻ります。普通はトップページ登録ページです。
2.メカニズム原理、javax.servlet.Filterインターフェースを実現する
説明:
(1).Servlet容器作成フィルタ例(2).フィルタ例はinit方法を呼び出し、フィルタの初期化パラメータ(3)を読み取る。フィルタ例はドFilter方法を呼び出し、初期化パラメータの値から要求が正当かどうか判断する。要求が正当でない場合は要求をブロックする(5)この要求が適法であれば、chain.doFilter方法を呼び出して、この要求を後続に転送する。
3.あなたのweb.xmlの構成は以下の通りです。

 sessionfilter
 com.zhongway.pub.SessionFilter


 sessionfilter
 *.jsp


 sessionfilter
 *.do
説明:私はこれはブロックですので、jspとdoの要求は、読者が自分で実際のプロジェクトによって自分で書くことができます。
4.フィルタのコード:
package com.zhongway.pub;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

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 javax.servlet.http.HttpSession;

/**
 *     :   , session   ,       
 */
public class SessionFilter implements Filter {
	private FilterConfig config;
	public static ThreadLocal threadLocal = new ThreadLocal();

	public void setFilterConfig(FilterConfig config) {
		this.config = config;
	}

	public FilterConfig getFilterConfig() {
		return config;
	}
	//           ,                  
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) {
		threadLocal.set((HttpServletRequest) request);
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		HttpSession session = req.getSession(false);
		// res.setCharacterEncoding("GBK");
		
		if (req.getHeader("X-Requested-With") != null && req.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")) {
			try {
				req.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    } else{
	    	res.setContentType("text/html; charset=gbk");
	    	try {
				req.setCharacterEncoding("gbk");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }
		String paramfilter = ""; //         
		String request_uri = req.getRequestURI().toUpperCase(); //        URI
		String ctxPath = req.getContextPath(); //   web          
		String uri = request_uri.substring(ctxPath.length()); //        ,         
		if(null != req.getParameter("paramfilter")){
			paramfilter = req.getParameter("paramfilter");
		}
		try {
			if(paramfilter.equals("true") || 
					uri.equals("/")||
					uri.equals("/WELCOME.JSP") ||
					uri.equals("/LOGIN.JSP")||
					uri.equals("/LOGIN.do")||
					//               jsp    
					session != null){
				//  FilterChain     doFilter  ,              
				chain.doFilter(req, res);
			}
			
			else {
				
				 //               
				 PrintWriter out = res.getWriter();
				 out.println("alert('    ,     !');" +
		             		"parent.parent.window.location='"+req.getContextPath()+"/web_admin/login.jsp';");
	            return;
				
				
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//        
	public void destroy() {
		// TODO Auto-generated method stub
		config = null;
	}
    //           
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		this.config = filterConfig;
	}
}
5.最後に、自分でweb.xmlにsessionキャッシュ時間を設定して、期限が切れます。
 
        15
   
解釈:単位分、今回は15分、もし-1代表sessionが永久に有効であるならば。
6.ログインページが二つあると、フロントとバックグラウンドはそれぞれ期限が過ぎてフロントとバックグラウンドに戻ります。まだどうやって書くか分かりません。期限が過ぎたらどう判断しますか?