剛開始接觸技術,對這片領域充滿了好奇,第一次寫博客心里有點小激動~,開通此博客的主要目的是為了將自己學到的一些東西記錄下來,這是一個復習與總結的過程,有利於鞏固自己對知識的理解。俗話說的好,好記性不如爛筆頭,學習——思考——總結——記錄,技術的學習周期一般是這樣的,希望我能堅持下去,能在技術這條路上走的更遠!Say good luck to myself!
好了,廢話不多說直接進入主題:本文主要記錄web開發中過濾器的應用。
通常,我們在登錄一些網站后比如說登錄某論壇,如果想發表評論,系統往往會提示:“您還沒有登錄,請登錄后在。。。。”這里系統檢測用戶是否登錄的過程就用到了過濾器。過濾器主要是實現Filter接口,比如:
package com.chris.filter; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; 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.catalina.connector.Request; import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; public class LoginFilter implements Filter { private String sessionKey; private String rediretUrl; private String uncheckedUrls; @Override public void init(FilterConfig filterConfig) throws ServletException { ServletContext servletContext=filterConfig.getServletContext(); sessionKey=servletContext.getInitParameter("userSessonKey"); rediretUrl=servletContext.getInitParameter("rediretUrl"); uncheckedUrls=servletContext.getInitParameter("uncheckedUrls"); } @Override public void destroy() { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse=(HttpServletResponse) servletResponse; //1、得到用戶請求路徑 String servletPath=httpServletRequest.getServletPath(); //2、放行不需要過濾的頁面,如登錄界面之類的 List<String> urls=Arrays.asList(uncheckedUrls.split(",")); if(urls.contains(servletPath)){ filterChain.doFilter(httpServletRequest, httpServletResponse); return; } //3、從session中獲取用戶並判斷用戶是否登錄過,如果沒有登錄過則重定向到登錄界面 Object user= httpServletRequest.getSession().getAttribute(sessionKey);if(user==null){ httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+rediretUrl); return; } //4、否則放行 filterChain.doFilter(httpServletRequest, httpServletResponse); } }
文中sessionKey,rediretUrl,uncheckedUrls是初始化在web.xml中的,在LoginFilter 中通過FilterConfig對象獲取這些值,這里FilterConfig類似於ServletConfig:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>LoginFilter</display-name> <welcome-file-list> <welcome-file>login/index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>userSessonKey</param-name> <param-value>USERSESSONKEY</param-value> </context-param> <context-param> <param-name>rediretUrl</param-name> <param-value>/login/login.jsp</param-value> </context-param> <context-param> <param-name>uncheckedUrls</param-name> <param-value>/login/a.jsp,/login/login.jsp,/login/index.jsp,/login/dologin.jsp</param-value> </context-param> <filter> <filter-name>loginFilter</filter-name> <filter-class>com.chris.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/login/*</url-pattern> </filter-mapping> </web-app>
本例子中為了方便,LoginFilter 類中的form表單的action是跳轉到另一個jsp中的——dologin.jsp.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% String username = request.getParameter("username"); if (username != null && !username.trim().equals("")) {
//如果username不為空則將username放入到session中,以便LoginFilter 類中進行用戶是否登錄的判斷 session.setAttribute(application.getInitParameter("userSessonKey"), username); response.sendRedirect("index.jsp"); }else{ response.sendRedirect("login.jsp"); } %> </body> </html>
到這里,一個簡單的檢測用戶是否登錄的過濾器就完成了。本人理解比較淺顯,請各位大神指正!