來源:http://blog.csdn.net/lzsf1984/article/details/7893318
功能描述
用於檢查使用者是否登入了系統,如果未登入,則重定向到指的登入頁面。
使用方法
在 java web 專案的 web.xml 檔案中新增如下程式碼,對每個引數都進行了詳細的說明。
<!—檢查使用者是否登入了系統的過濾器配置 開始 --> < filter >
< filter-name >SessionFilter</ filter-name >
< filter-class >com.hmw.filter.SessionFilter</ filter-class >
< init-param >
< description >將當前登入的使用者的資訊儲存在 session 中時使用的key,如果沒有配置此引數,則該過濾器不起作用</ description >
< param-name >sessionKey</ param-name >
< param-value >userInfo</ param-value >
</ init-param >
< init-param >
< description >
如果使用者未登入(即在 session 中 key 為 sessionKey 的屬性不存在或為空),則將請求重定向到該 url。
該 url 不包含web應用的 ContextPath。
如果不配置此引數,則在使用者未登入系統的情況下,直接重定向到web應用的根路徑(/)
</ description >
< param-name >redirectUrl</ param-name >
< param-value >/login.jsp</ param-value >
</ init-param >
< init-param >
< description >
不需要進行攔截的 url 的正規表示式,即:如果當前請求的 url 的 servletPath 能匹配該正規表示式,則直接放行(即使未登入系統)。
此引數的值一般為 loginServlet 和 registServlet 等。
另外,引數 redirectUrl 的值不用包含在該正規表示式中,因為 redirectUrl 對應的 url 會被自動放行。
還有一點需要說明的是,該引數的值不包含web應用的 ContextPath。
</ description >
< param-name >excepUrlRegex</ param-name >
<!-- 不攔截 /servlets/loginServlet 和 /servlets/registServlet -->
< param-value >/servlets/(login|regist)Servlet</ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name >SessionFilter</ filter-name >
< url-pattern >/servlets/*</ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name >SessionFilter</ filter-name >
< url-pattern >/jsp/*</ url-pattern >
</ filter-mapping >
<!—檢查使用者是否登入了系統的過濾器配置 結束 --> |
過濾器原始碼
package
com.hmw.filter;
import
java.io.IOException;
import
java.net.URLEncoder;
import
java.util.regex.Pattern;
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;
import
org.apache.commons.lang.StringUtils;
/**
* 用於檢查使用者是否登入了系統的過濾器<br>
* 建立日期:2012-01-09
* @author <a href="mailto:hemingwang0902@126.com">何明旺</a>
*/
public
class
SessionFilter
implements
Filter {
/** 要檢查的 session 的名稱 */
private
String sessionKey;
/** 需要排除(不攔截)的URL的正規表示式 */
private
Pattern excepUrlPattern;
/** 檢查不通過時,轉發的URL */
private
String forwardUrl;
@Override
public
void
init(FilterConfig cfg)
throws
ServletException {
sessionKey = cfg.getInitParameter(
"sessionKey"
);
String excepUrlRegex = cfg.getInitParameter(
"excepUrlRegex"
);
if
(!StringUtils.isBlank(excepUrlRegex)) {
excepUrlPattern = Pattern.compile(excepUrlRegex);
}
forwardUrl = cfg.getInitParameter(
"forwardUrl"
);
}
@Override
public
void
doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws
IOException, ServletException {
// 如果 sessionKey 為空,則直接放行
if
(StringUtils.isBlank(sessionKey)) {
chain.doFilter(req, res);
return
;
}
// * request.getRequestURL(): http://127.0.0.1:8080/webApp/home.jsp
// * request.getContextPath(): /webApp
// * request.getServletPath():/home.jsp
// * request.getRequestURI(): /webApp/home.jsp
// * request.getQueryString():a=1&b=2
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String servletPath = request.getServletPath();
// 如果請求的路徑與forwardUrl相同,或請求的路徑是排除的URL時,則直接放行
if
(servletPath.equals(forwardUrl) || excepUrlPattern.matcher(servletPath).matches()) {
chain.doFilter(req, res);
return
;
}
Object sessionObj = request.getSession().getAttribute(sessionKey);
// 如果Session為空,則跳轉到指定頁面
if
(sessionObj ==
null
) {
String contextPath = request.getContextPath();
String redirect = servletPath +
"?"
+ StringUtils.defaultString(request.getQueryString());
/*
* login.jsp 的 <form> 表單中新增一個隱藏表單域:
* <input type="hidden" name="redirect" value="${param.redirect }">
*
* LoginServlet.java 的 service 的方法中新增如下程式碼:
* String redirect = request.getParamter("redirect");
* if(loginSuccess){
* if(redirect == null || redirect.length() == 0){
* // 跳轉到專案主頁(home.jsp)
* }else{
* // 跳轉到登入前訪問的頁面(java.net.URLDecoder.decode(s, "UTF-8"))
* }
* }
*/
response.sendRedirect(contextPath + StringUtils.defaultIfEmpty(forwardUrl,
"/"
)
+
"?redirect="
+ URLEncoder.encode(redirect,
"UTF-8"
));
}
else
{
chain.doFilter(req, res);
}
}
@Override
public
void
destroy() {
}
}