过滤器基本介绍
过滤器的大致功能如下所示
一般来说我们使用过滤器来拦截请求,并且对拦截的请求进行特别处理。
Servlet中的过滤器接口
我们可以看到Filter类的结构如下:
Filter过滤器的简单使用案例
在本个案例中,我们将创建一个简单的过滤器,其主要功能为拦截/servlet/*
URL路径下的请求,并且设置拦截到请求的字符格式。
1.导入对应的jar包
我们使用的Filter接口需要导入javax.servlet.Filter
包,一般来说,我们可以直接导入javax.servlet
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
2.创建一个拦截器
创建一个类,实现Filter接口,并且在doFilter()方法中编写对应的拦截方法
package com.kuang.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter创建完成...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=utf-8");
// 继续完成链后面的过滤器类
filterChain.doFilter(servletRequest,servletResponse);//如果不加这个那么请求就不会往下运行
}
@Override
public void destroy() {
System.out.println("Filter销毁完成...");
}
}
3.添加对应的Filter映射
在web.xml中添加我们编写的Filter对应的映射<ilter和filter-mapping
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
4.编写一个简单的Servlet,用于测试Filter
我们可以编写一个简单的Servlet类,它只用于输出一串简单的中文字符,并且给这个Servlet设置两个对应的servlet-mapping,一个URL路径在’/servlet/*'路径下,另外一个不在
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FilterTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("你好啊!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
添加Servlet类的映射(两个)
<servlet>
<servlet-name>filterTest</servlet-name>
<servlet-class>com.kuang.servlet.FilterTestServlet</servlet-class>
</servlet>
<!-- 添加两个映射路径-->
<servlet-mapping>
<servlet-name>filterTest</servlet-name>
<url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>filterTest</servlet-name>
<url-pattern>/show</url-pattern>
</servlet-mapping>
5.启动服务器,进行测试
我们可以看到当我们发出在’/servlet’目录下的请求时,请求会被过滤器拦截并且被过滤器进行了字符格式设置的处理所以页面输出的字符不是乱码;而当我们访问不是‘/servlet’目录下的请求时,请求没有被拦截,所以字符格式没有被设置,页面输出的字符为乱码
另外我们可以看到,当服务器启动时,过滤器被创建,调用init()方法;当服务器终结时,过滤器被销毁,调用destroy()方法。
Filter过滤器实用案例 : 过滤未登录用户
在此案例中我们将编写一个只用当用户登录之后才可以访问的页面,当用户没有登录时想要访问此页面会被过滤器拦截。
在此案例中我们判断用户是否登录的方法是在用户登录之后在Session中添加一个USER_ID属性,其内容就是此Session的ID。
1.创建简单的JSP
我们主要创建登录页面、登录成功页面、登录失败页面、未登录页面这四个JSP。
它们代码如下:
登录页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<form method="post" action="/servlet/login">
<input type="text" name="username"/>
<input type="submit">
</form>
</body>
</html>
登录成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
登录成功!!!
<a href="/servlet/logout">注销</a>
</body>
</html>
登录失败页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录失败</title>
</head>
<body>
登录失败
<a href="Login.jsp">再次登录</a>
</body>
</html>
未登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
未登录,请先<a href="Login.jsp">登录</a>
</body>
</html>
2.编写登录Servelt已经注销Servlet
登录Servetl:
package com.kuang.servlet;
import com.kuang.utils.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取前端输入数据
String username = (String) req.getParameter("username");
// 2.根据前端输入数据进行判断
if ( "BugMaker".equals(username) ){
// 2.1 用户名输入正确,在session中添加一个字段以便’标记‘此Session登录成功
req.getSession().setAttribute(Constant.USER_ID,req.getSession().getId());
resp.sendRedirect("/sys/LoginSuccess.jsp");
}else{
// 2.2 用户名输入错误,返回登录失败页面
resp.sendRedirect("/LoginFailed.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注销Servlet
package com.kuang.servlet;
import com.kuang.utils.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取Session
HttpSession session = req.getSession();
String userId = (String) session.getAttribute(Constant.USER_ID);
// 2,如果Session中有USER_ID或者USER_ID异常那么就将此属性移除
if(userId != null || "".equals(userId)){
session.removeAttribute(Constant.USER_ID);
}
// 3.重定向到登录页面
resp.sendRedirect("/Login.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.编写过滤器
package com.kuang.filter;
import com.kuang.utils.Constant;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
if (session.getAttribute(Constant.USER_ID) == null){
response.sendRedirect("/Error.jsp");
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
运行结果:
当我们没有登录就访问登录成功页面时: