Filter(過濾器)常見應用詳解(附代碼)
統一全站字符編碼的過濾器
通過配置參數encoding指明使用何種字符編碼,以處理Html Form請求參數的中文問題
爲了靈活性把編碼放到web.xml文件中
<filter>
<filter-name>CharseterEncodingFilter</filter-name>
<filter-class>com.hbsi.web.filter.CharseterEncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
讓所有的jsp和servlet通過過濾器
<filter-mapping>
<filter-name>CharseterEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharseterEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
Java代碼:
package com.hbsi.web.filter;
import java.io.IOException;
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;
public class CharseterEncodingFilter implements Filter {
private FilterConfig config = null;//獲取編碼
private String defaultCharset = "UTF-8";//如果忘了配編碼那麼自幾配個
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String charset = config.getInitParameter("charset");//獲取編碼,取出編碼,
//如果忘了配編碼那麼
if(charset==null){
charset = defaultCharset;
}
//響應
request.setCharacterEncoding(charset);
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset="+charset);
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
}
}
建一個jsp驗證:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '1.jsp' starting page</title>
</head>
<body>
<form action="servlet/ServletDemo1" method="post">
城市:<input type="text" name="city"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
然後servlet
package com.hbsi.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String city = request.getParameter("city");
response.getWriter().write(city);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
最後若是沒有配過濾器就會出現亂碼
禁止瀏覽器緩存所有動態頁面的過濾器:
有 3 個 HTTP 響應頭字段都可以禁止瀏覽器緩存當前頁面,它們在 Servlet 中的示例代碼如下:
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
並不是所有的瀏覽器都能完全支持上面的三個響應頭,因此最好是同時使用上面的三個響應頭。
Expires數據頭:值爲GMT時間值,爲-1指瀏覽器不要緩存頁面
Cache-Control響應頭有兩個常用值:
no-cache指瀏覽器不要緩存當前頁面。
max-age:xxx指瀏覽器緩存頁面xxx秒。
新建個過濾器:
package com.hbsi.web.filter;
import java.io.IOException;
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;
public class NoCacheFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
//設置響應頭
//轉成HttpServlet形式的纔有DateHeader等方法
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
resp.setDateHeader("expires",-1);//過期時間,不緩存頁面
resp.setHeader("Cache-Control", "no-cache");//沒有緩衝,緩衝控制
resp.setHeader("Pragma", "no-cache");//也相當於沒有緩衝
chain.doFilter(req,resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
//等會請求都要經過過濾器
在web.xml中配置請求
<filter>
<filter-name>NoCahceFilter</filter-name>
<filter-class>com.hbsi.web.filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCahceFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>NoCahceFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
控制瀏覽器緩存頁面中的靜態資源的過濾器:
場景:有些動態頁面中引用了一些圖片或css文件以修飾頁面效果,這些圖片和css文件經常是不變化的,所以爲減輕服務器的壓力,可以使用filter控制瀏覽器緩存這些文件,以提升服務器的性能。
新建一個過濾器:
package com.hbsi.web.filter;
//控制瀏覽器可以緩存js,css,jpg。
import java.io.IOException;
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;
public class ExpiresFilter implements Filter {
private FilterConfig config;//聲明
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//首先轉化下
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//獲取那些參數的值,通過config
String uri = req.getRequestURI();
if(uri.endsWith(".css")){
long time = Integer.parseInt(config.getInitParameter("css"))*1000;
resp.setDateHeader("expires",System.currentTimeMillis()+time);
}else if(uri.endsWith(".js")){
long time = Integer.parseInt(config.getInitParameter("js"))*1000;
resp.setDateHeader("expires",System.currentTimeMillis()+time);
}else if(uri.endsWith(".jpg")){
long time = Integer.parseInt(config.getInitParameter("jpg"))*1000;
resp.setDateHeader("expires",System.currentTimeMillis()+time);
}
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;//賦給
}
}
在web.xml文件中配置哪些內容允許緩衝:
<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>com.hbsi.web.filter.ExpiresFilter</filter-class>
//設置緩衝時間的參數,允許緩衝多穿時間
<init-param>
<param-name>css</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>jpg</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>js</param-name>
<param-value>120</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.css</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ExpiresFilter</filter-name>
<url-pattern>*.js</url-pattern>
</filter-mapping>
最後寫jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP '2.jsp' starting page</title>
</head>
<body>
<img src="tu.jpg" width="200" height="200"/>
</body>
</html>
實現用戶自動登陸的過濾器
在用戶登陸成功後,發送一個名稱爲user的cookie給客戶端,cookie的值爲用戶名和md5加密後的密碼。
編寫一個AutoLoginFilter,這個filter檢查用戶是否帶有名稱爲user的cookie來,如果有,則調用dao查詢cookie的用戶名和密碼是否和數據庫匹配,匹配則向session中存入user對象(即用戶登陸標記),以實現程序完成自動登陸。
先做個jsp文件:login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">
用戶名:<input type="text" name="username"><br/>
密碼:<input type="password" name="password"><br/>
有效期:<input type="radio" name="autoLoginTime" value="${60*60}">1小時
<input type="radio" name="autoLoginTime" value="${10*60}">10分鐘
<input type="radio" name="autoLoginTime" value="120">2分鐘<br/>
<input type="submit" value="登陸">
</form>
</body>
</html>
//省率(用戶登錄,連接數據庫導一些包,包括數據庫一些信息)
//其中用戶登錄實現如圖效果:
建一個servlet文件:功能獲取信息
package com.hbsi.web.servlet;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
import com.hbsi.dao.UserDao;
import com.hbsi.domain.User;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
int autoLoginTime =Integer.parseInt(request.getParameter("autoLoginTime"));
UserDao dao = new UserDao();
User user = dao.find(username, password);
if(user!=null){
request.getSession().setAttribute("user",user);
//String password1 = user.getPassword();
//String md5password = md5(password1);
//System.out.println(md5password);
Cookie cookie1 = new Cookie("username",user.getUsername());
Cookie cookie2 = new Cookie("password",user.getPassword());
//Cookie cookie2 = new Cookie("password",md5password);
cookie1.setMaxAge(autoLoginTime);
cookie2.setMaxAge(autoLoginTime);
cookie1.setPath("/FilterDemo");
cookie2.setPath("/FilterDemo");
response.addCookie(cookie1);
response.addCookie(cookie2);
response.sendRedirect("/FilterDemo/welcome.jsp");
}else{
request.setAttribute("message","用戶名密碼錯");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
}
private String md5(String input){
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] result = md.digest(input.getBytes());
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(result);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
編寫過濾器:(自動登錄過濾器)
package com.hbsi.web.filter;
import java.io.IOException;
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 com.hbsi.dao.UserDao;
import com.hbsi.domain.User;
public class AutoLoginFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//首先還是轉成Http的
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//1.檢查用戶是否登錄
User user = (User) req.getSession().getAttribute("user");
if(user!=null){
chain.doFilter(req,resp);
return;
}
//2.檢查用戶是否帶cookie來
String username = null;
String password = null;
Cookie[] cookies = req.getCookies();
for(int i=0;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("username")){
username = cookies[i].getValue();
}
if(cookies[i].getName().equals("password")){
password = cookies[i].getValue();
}
}
if(username==null && password==null){
chain.doFilter(req, resp);
return;
}
//和數據庫裏的用戶和密碼比較
UserDao dao = new UserDao();
User user1 = dao.find(username);
String save_password = user1.getPassword();
if(!password.equals(save_password)){
chain.doFilter(req, resp);
return;
}
req.getSession().setAttribute("user",user1);
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
在web.xml中配置:
<filter>
<filter-name>AutoLoginFilter</filter-name>
<filter-class>com.hbsi.web.filter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AutoLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>