/*
* 功能区别:
* 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,以上整个项目的创建完成。