Filter(过滤器)常见应用详解(附代码)

本文深入解析了过滤器在Web开发中的应用,包括统一全站字符编码、禁止浏览器缓存动态页面以及实现用户自动登录的机制。详细介绍了如何通过配置过滤器解决中文字符编码问题,确保页面显示正确;如何设置HTTP响应头来禁止浏览器缓存,提升用户体验;以及通过过滤器实现用户登录后自动保存会话状态,简化登录流程。

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值