剛剛有個朋友問我,Servlet的過濾器有什么作用?
現在發個帖子說明一下,
? ?? ?? ???過濾器是一個對象,可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理,而且能夠在響應離開Servlet /JSP之后對其進行后處理。所以如果你有幾個Servlet/JSP需要執行同樣的數據轉換或頁面處理的話,你就可以寫一個過濾器類,然后在部署描述文 件(web.xml)中把該過濾器與對應的Servlet/JSP聯系起來。你可以一個過濾器以作用于一個或一組servlet,零個或多個過濾器能過濾 一個或多個servlet。
? ?? ?? ?一個過濾器實現java.servlet.Filter接口并定義它的三個方法:
? ? 1. void init(FilterConfig config) throws ServletException:在過濾器執行service前被調用,以設置過濾器的配置對象。
? ? 2. void destroy();在過濾器執行service后被調用。
? ? 3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
? ?? ? 可能這么說,大家還是不太理解。舉個例子來說,面向對象語言的特征里有個接口的概念,一個類實現該接口,就必須要實現接口的所有方法。那么如果我寫了一個類,實現這個接口又不想實現所有方法,怎么辦呢?
? ?? ?寫個抽象類,實現這個接口的所有方法,然后我寫的類繼承這個抽象類。就可以不用實現所有方法了。看到這里大家都懂了過濾器是干什么的吧
? ?? ?
? ?? ?既然懂了,那就直接上代碼說明一下怎么配置的。
開發EncodingFilter.java文件,繼承自javax.servlet.Filter: package bluemoon.crm.systemmanage.struts.Filter;import java.io.*; import javax.servlet.*;public class EncodingFilter implements Filter { protected String encoding = null; protected FilterConfig config;public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; //從web.xml配置文件中獲取編碼配置 this.encoding = filterConfig.getInitParameter("Encoding"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(request.getCharacterEncoding() == null) { String encode = getEncoding(); if(encode != null) { //設置request的編碼方式 request.setCharacterEncoding(encode); } } chain.doFilter(request,response); } public String getEncoding() { return encoding; } public void destroy() {} }
在web.xml文件中加入如下配置信息:
<!-- 頁面請求編碼過濾器 注意每個頁面的pageEncoding="GB2312" -->
<filter><filter-name>encodingFilter</filter-name><filter-class>bluemoon.crm.systemmanage.struts.Filter.EncodingFilter</filter-class><init-param><param-name>Encoding</param-name><param-value>GB2312</param-value></init-param>
</filter>
<filter-mapping><filter-name>encodingFilter</filter-name><!-- 對全部的jsp頁面有效,比較郁悶的是沒有太多的配置方式 --><url-pattern>/*</url-pattern>
</filter-mapping>
?用戶是否登陸過濾器:
1.首先增加一個Action、ActionForm & JSP: login.jsp中為一個登陸表單: UserActionForm.java為一個Struts的ActionForm。 UserAction.java將用戶登陸信息添加到session中。
開發UserLoginedFilter.java:
package bluemoon.crm.systemmanage.struts.Filter;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.*;import bluemoon.crm.systemmanage.struts.forms.UserActionForm;public class UserLoginedFilter extends HttpServlet implements Filter
{
protected FilterConfig config;public void init(FilterConfig filterConfig) throws ServletException
{
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
RequestDispatcher dispatcher = request.getRequestDispatcher("userLogin.jsp");
HttpServletRequest userRequest = (HttpServletRequest)request;
UserActionForm userActionForm = (UserActionForm)userRequest.getSession().getAttribute("userActionForm");
if(userActionForm == null || userActionForm.getUser_name() == null || userActionForm.getUser_name().trim().length()<1)
{
System.out.println("用戶未登錄!");
dispatcher.forward(request,response);
return;
}
System.out.println("用戶已登錄!");
chain.doFilter(request,response);
}
public void destroy()
{
}
}
?
在web.xml文件中添加如下配置信息:
<!—用戶是否登陸過濾器配置 注意只過慮jsp頁面,不過慮.do -->
<filter>
<filter-name>userLoginedFilter</filter-name>
<filter-class>bluemoon.crm.systemmanage.struts.Filter.UserLoginedFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>userLoginedFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!—用戶是否登陸過濾器配置結束 -->
?
用戶是否登陸過濾器在多模塊中的應用:
1.修改上面的過濾器代碼:
package bluemoon.crm.systemmanage.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.*;import bluemoon.crm.systemmanage.struts.forms.UserForm;//用戶未登陸過濾器
public class UserNoLoginedFilter extends HttpServlet implements Filter
{protected FilterConfig config;public void init(FilterConfig filterConfig) throws ServletException
{
this.config = filterConfig;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
//首先預定義到要轉向的頁面,由此帶來的問題就是userLogin.jsp頁面的圖片必須要使用絕對路徑,方法見userLogin.jsp頁面
RequestDispatcher dispatcher = request.getRequestDispatcher("/toLogin.do?prefix=&page=/userLogin.jsp");
//注意在struts-config.xml中增加一個Action,如下:
/*
*<action
* attribute="userForm"
* name="userForm"
* path="/toLogin"
* scope="request"
* type="org.apache.struts.actions.SwitchAction" />
*/
// 從session中獲取用戶form
HttpServletRequest userRequest = (HttpServletRequest)request;
UserForm userForm = (UserForm)userRequest.getSession().getAttribute("userForm");//如果未登陸則沒有userFrom信息
if(userForm == null || userForm.getUser_name() == null || userForm.getUser_name().trim().length()<1)
{
System.out.println("用戶未登錄!");//分發到登陸頁面
dispatcher.forward(request,response);
//((HttpServletResponse)response).sendRedirect("toModule.do?prefix=&page=/userLogin.jsp");
return;
}System.out.println("用戶"+userForm.getUser_name()+"已登錄!");
chain.doFilter(request,response);
}
public void destroy()
{}
}
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 注:版權所有,未經本人同意不得轉載