Filter(過濾器)常見應用詳解(附代碼)

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>

讓所有的jspservlet通過過濾器

<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);

}

}

最後若是沒有配過濾器就會出現亂碼

禁止瀏覽器緩存所有動態頁面的過濾器:

有 個 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;

//控制瀏覽器可以緩存jscssjpg

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>

實現用戶自動登陸的過濾器

在用戶登陸成功後,發送一個名稱爲usercookie給客戶端,cookie的值爲用戶名和md5加密後的密碼。

編寫一個AutoLoginFilter,這個filter檢查用戶是否帶有名稱爲usercookie來,如果有,則調用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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章