首先我们先了解过滤器Filter与Serlet的区别
/*
* 功能区别:
* Serlet用于处理业务逻辑的
* Filter用于拦截、检查和处理请求和响应
* 代码区别:
* Filter生命周期函数多出了doFilter()
* Filter的init()和Serlet的init()执行的时间不一样,servlet在客户端第一次访问servlet时,此servlet调用init初始化,Filter在web服务器(在这里我们使用tomcat)启动时就调用init初始化
* web.xml配置区别
* Servlet的url-pattern表示访问路径
* Filter的url-pattern表示过滤器过滤范围。即过滤某个目录
/*
* 功能区别:
* Serlet用于处理业务逻辑的
* Filter用于拦截、检查和处理请求和响应
* 代码区别:
* Filter生命周期函数多出了doFilter()
* Filter的init()和Serlet的init()执行的时间不一样,servlet在客户端第一次访问servlet时,此servlet调用init初始化,Filter在web服务器(在这里我们使用tomcat)启动时就调用init初始化
* web.xml配置区别
* Servlet的url-pattern表示访问路径
* Filter的url-pattern表示过滤器过滤范围。即过滤某个目录
* */
接下来,我们需要在eclipse中创建web项目Filter_login。在WebContent目录中创建以下两个jsp页面。
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> </head> <body> <% Boolean islogin = (Boolean) session.getAttribute("islogin"); if (islogin == null || islogin == false) { /* 用户未登录 */ response.sendRedirect("login.jsp"); } %> <!-- 用户已登录 --> <h1>欢迎来到首页</h1> </body> </html>
login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> </head> <body> <form action="LoginServlet" method="post"> name: <input type="text" name="name"> password: <input type="text" name="password"> <input type="submit" value="提交"> </form> </body> </html>
我们对以上login.jsp进行登录验证,需要创建一个LoginServlet.java的Servlet文件,代码如下:
LoginServlet.java
package com.wen; /** * 通过session设置访问标识符,只有login.jsp输入用户名和密码,,并且通过LoginServlet验证登陆信息正确后才能访问index.jsp*/ import java.io.IOException; 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 javax.websocket.Session; public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.接收请求,获取数据 String name = req.getParameter("name"); String password = req.getParameter("password"); // 2.判断数据是否正确(可能涉及数据库) // 3.根据判断结果跳转页面 if (name.equals("wen") && password.equals("123")) { // 登录成功,跳转到主页,需要改变地址和页面,Response的sendRedirect重定向页面 HttpSession session =req.getSession(); session.setAttribute("islogin", true); resp.sendRedirect("index.jsp"); } else { // 登录失败,转回到首页 resp.getWriter().println("<script>window.history.back()</script>");// resp.sendRedirect("login.jsp"); } } }
接下来开始创建过滤器。
首先先了解过滤器的实现步骤:
1、自定义类实现Filter接口并实现init();doFilter();destroy;三个方法
2、在web.xml中配置Filter,与Servlet配置类似,只是配置标签为<filter***>
在这里我们分别创建两个过滤器,一个用来拦截和过滤用户请求,一个用来设置编码。
其中FirstFilter.java用来拦截和过滤用户请求;EncodingFilter.java用来设置编码
在src中创建一个包com.wen,然后在包里创建一个FirstFilter.java和EncodingFilter.java文件,并实现Filter接口,代码如下:
FirstFilter.java
package com.wen; 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; public class FirstFilter implements Filter { /*与servlet初始化的区别: servlet在客户端第一次访问servlet时,此servlet调用init初始化 Filter在tomcat启动时就调用init初始化 */ @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("init"); } //进行过滤动作,只要有请求通过该此过滤器,那么过滤器的doFilter就会执行 //第三个参数FilterChain chain是用于放行请求的 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter"); //如果不写doFilter ,则过滤器默认会拦截请求 chain.doFilter(request, response);//放行请求,请求通过过滤器,并且能够到达具体资源 } @Override public void destroy() { System.out.println("destroy"); } }
EncodingFilter.java
package com.wen; 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; public class EncodingFilter implements Filter { @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("init"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //设置编码 request.setCharacterEncoding("utf-8"); //放行 chain.doFilter(request, response); } @Override public void destroy() { System.out.println("destroy"); } }
以上步骤都完成之后,需要在WebContent\WEB-INF下的web.xml中对LoginServlet.java、FirstFilter.java和EncodingFilter.java三个文件进行配置。配置如下:
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>02Filter_login</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!--配置Filter过滤器--> <filter> <filter-name>FirstFilter</filter-name> <filter-class>com.wen.FirstFilter</filter-class> </filter> <!-- 过滤器没有访问路径,因为过滤器根本不是让用户访问的, 而是在服务器运行中提供对请求和响应拦截检查处理功能的 url-pattern在这里表示过滤器过滤范围。即过滤某个目录 --> <filter-mapping> <filter-name>FirstFilter</filter-name> <url-pattern>/*</url-pattern><!-- 表示过滤当前整个web应用资源 --> </filter-mapping> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.wen.EncodingFilter</filter-class> </filter> <!-- 过滤器没有访问路径,因为过滤器根本不是让用户访问的, 而是在服务器运行中提供对请求和响应拦截检查处理功能的 url-pattern在这里表示过滤器过滤范围。即过滤某个目录 --> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern><!-- 表示过滤当前整个web应用资源 --> </filter-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.wen.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app>
OK,以上整个项目的创建完成。