Servlet过滤器

1.脏话过滤器

<span style="font-size:24px;">//过滤脏话
public class DirtyFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		DirtyRequest dirtyrequest = new DirtyRequest(request);

		chain.doFilter(dirtyrequest, response);
	}

	public void init(FilterConfig arg0) throws ServletException {

	}

}

class DirtyRequest extends HttpServletRequestWrapper {
	private HttpServletRequest request;

	public DirtyRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	private List<String> dirtyWords = Arrays.asList("傻逼", "操蛋", "畜生");

	public String getParameter(String name) {
		String value = this.request.getParameter(name);
		if (value == null) {
			return null;
		}
		for (String dirtyWord : dirtyWords) {
			if (value.contains(dirtyWord)) {
				value = value.replace(dirtyWord, "****");
			}
		}
		return value;
	}
}</span>

2.编码过滤器

<span style="font-size:24px;">//为解决全站的乱码问题
public class CharacterEncodingFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;

		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");

		MyCharacterEncodingRequest requestWrapper = new MyCharacterEncodingRequest(
				request);
		chain.doFilter(requestWrapper, response);

	}

	public void init(FilterConfig filterConfig) throws ServletException {

	}

}

/*
 *   1.实现与被增强对象相同的接口 
 *   2、定义一个变量记住被增强对象
 *   3、定义一个构造器,接收被增强对象 
 *   4、覆盖需要增强的方法
 *   5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
 */

// 专门处理get请求参数
class MyCharacterEncodingRequest extends HttpServletRequestWrapper {
	private HttpServletRequest request;

	public MyCharacterEncodingRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	public String getParameter(String name) {
		try {
			String value = this.request.getParameter(name);
			if (value == null) {
				return null;
			}
			if (!this.request.getMethod().equalsIgnoreCase("get")) {
				return value;
			}
			value = new String(value.getBytes("ISO8859-1"),
					this.request.getCharacterEncoding());
			return value;

		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}</span>

3.实现用户自动登陆的过滤器
在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。
编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie来,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

public class AutoLoginFilter implements Filter {

	public void destroy() {

	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		//如果用户已经登录,直接放行
		if (request.getSession().getAttribute("user") != null) {
			chain.doFilter(request, response);
			return;
		}
		//如果用户没有登陆则:
					// 1.得到用户带过来的autologin的cookie
					String value = null;
					Cookie cookies[] = request.getCookies();
					for (int i = 0; cookies != null && i < cookies.length; i++) {
						if (cookies[i].getName().equals("autologin")) {
							value = cookies[i].getValue();
						}
					}
					// 2.得到cookie中的用户名和密码
					if (value != null) {
						String username = value.split("\\.")[0];
						String password = value.split("\\.")[1];
						System.out.println(username + "::" + password);
						// 3.调用dao获取用户对应的密码
						UserDao dao = new UserDao();
						User user = dao.find(username);
						String dbpassword = user.getPassword();
						// 4.检查用户带来的md5的密码和数据库中的密码是否匹配,如果匹配则自动登陆
						if (password.equals(WebUtils.md5(dbpassword))) {
							request.getSession().setAttribute("user", user);
						}
					}
					chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {

	}

}
LoginServlet
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");

		UserDao dao = new UserDao();
		User user = dao.find(username, password);
		if (user == null) {
			request.setAttribute("message", "用户名或者密码不对!!");
			request.getRequestDispatcher("/message.jsp").forward(request,
					response);
			return;
		}
		request.getSession().setAttribute("user", user);
		request.setAttribute("message", "恭喜,登录成功");
		// 发送自动登陆的cookie
		sendAutoLoginCookie(request, response, user);
		request.getRequestDispatcher("/message.jsp").forward(request, response);
	}

	private void sendAutoLoginCookie(HttpServletRequest request,
			HttpServletResponse response, User user) {
		int logintime = Integer.parseInt(request.getParameter("logintime"));
		Cookie cookie = new Cookie("autologin", user.getUsername() + "."
				+ WebUtils.md5(user.getPassword()));
		cookie.setMaxAge(logintime);
		cookie.setPath("/day18");
		response.addCookie(cookie);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

loginJSP

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP</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="logintime" value="3600">1小时 <input
			type="radio" name="logintime" value="${10*60 }">10分钟 <input
			type="radio" name="logintime" value="${5*60 }">5分钟 <br /> <input
			type="submit" value="登陆">

	</form>

</body>
</html>


3.WebUtils

<span style="font-size:24px;">import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

public class WebUtils {
	public static String md5(String message) {

		try {
			MessageDigest md = MessageDigest.getInstance("md5");
			byte result[] = md.digest(message.getBytes());
			BASE64Encoder encoder = new BASE64Encoder();
			return encoder.encode(result);
		} catch (NoSuchAlgorithmException e) {

			throw new RuntimeException(e);
		}

	}
}
</span>



### Servlet 过滤器的配置及使用方法 #### 1. 创建过滤器过滤器类需要实现 `javax.servlet.Filter` 接口,并重写其三个核心方法:`init`、`doFilter` 和 `destroy`。 - **`init` 方法**:在服务器启动时被调用,主要用于加载配置文件或初始化资源[^1]。 - **`doFilter` 方法**:这是过滤器的核心部分,用于拦截并处理请求和响应对象。可以在这里添加自定义逻辑,比如编码设置、权限验证等[^1]。 - **`destroy` 方法**:当服务器关闭时被调用,用于释放过滤器所占有的资源[^1]。 以下是一个简单的过滤器类示例: ```java import javax.servlet.*; import java.io.IOException; public class ExampleFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,例如读取配置参数 String param = filterConfig.getInitParameter("exampleParam"); System.out.println("初始化参数:" + param); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在这里可以对请求进行预处理 System.out.println("请求前的操作"); // 继续传递给下一个过滤器或目标资源 chain.doFilter(request, response); // 在这里可以对响应进行后处理 System.out.println("响应后的操作"); } public void destroy() { // 清理工作 System.out.println("销毁过滤器"); } } ``` --- #### 2. 配置过滤器 可以通过两种方式来配置过滤器:基于 XML 的配置和基于注解的配置。 ##### (1) 基于 XML 的配置 通过 `web.xml` 文件中的 `<filter>` 和 `<filter-mapping>` 标签完成过滤器的注册和映射。 - **<filter> 标签**:定义过滤器的名称及其对应的类名。 - **<filter-mapping> 标签**:指定哪些 URL 请求会被该过滤器拦截。 示例配置如下: ```xml <filter> <filter-name>ExampleFilter</filter-name> <filter-class>com.example.ExampleFilter</filter-class> <!-- 可选:定义初始化参数 --> <init-param> <param-name>exampleParam</param-name> <param-value>value</param-value> </init-param> </filter> <filter-mapping> <filter-name>ExampleFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 在这个例子中,所有匹配 `/secure/` 路径的请求都会经过 `ExampleFilter` 处理[^4]。 ##### (2) 基于注解的配置 如果使用的 Servlet 容器支持 Servlet 3.0 或更高版本,则可以直接使用 `@WebFilter` 注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值