在JavaWeb中的过滤器的意义是在每次访问网页的时候都会先经过过滤器,所以在过滤器内部一般是配置一些每个页面中的国定的操作,比如登陆验证或编码格式的更改。
定义一个FIlter类:
Filter类的本质是一个实现了Filter接口的Java类,所以我们只需要定义一个Java类实现Filter接口,并重写内部的三个方法即可
package Semester_3.src.Util_9;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("放行前的逻辑");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("放行后的逻辑");
}
@Override
public void destroy() {
}
}
其中主要的方法是doFilter方法,这个方法内部是真正进行过滤的逻辑操作的语句,当我们访问一个页面时,会首先执行方姓钱的逻辑,然后使用方法中的参数:filterChain的方法doFilter方法将请求放行,在请求完之后,再执行放行后的逻辑。注意在此时,放行前主要对请求数据进行处理操作,放行后主要对响应数据进行处理和操作
使用这个Filter:
可以看到,当我启动服务的时候,则会出现预先设置好的在控制台打印出来的语句,说明这个过滤器已经在工作了
配置拦截路径:
在一个过滤器中,使用@WebFilter(“/*”)注解配置拦截路径,其中括号内的值就是拦截路径,需要用双引号包裹起来,其中的可配置项如下:
拦截具体的资源:“/index.jsp”,当访问index.jsp这个文件的时候过滤器才会有效
目录拦截:”/User/*“,当访问User路径下的文件的时候过滤器才会有效
后缀名拦截:”*.jsp“,当访问后缀名为.jsp结尾的时候过滤器才会有效
拦截所有:”/*“,使用的频率最高,当访问所有的资源的时候过滤器都会生效
简单案例:
在了解了过滤器的基本实现的之后,做一个简单的案例:当我们在登陆的时候,如果不登录直接网站的其他资源只需要输入路径即可完成,这样肯定是不符合实际情况的,所以此时的需求就是利用过滤器,在每次访问资源的之后,都检查一下是否登录。
思路很简单,只需要在登陆的时候传入一个特殊的标记cookie,在过滤器中检查这个标记是否存在即可。
运行效果:
代码实现:
登录界面:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/11
Time: 18:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录界面</title>
<style>
.ta1{
border: 1px solid black;
text-align: center;
width: 500px;
}
td{
border: 1px solid black;
text-align: center;
}
.div1{
text-align: center;
display: block;
margin: 0 auto;
height: 300px;
width: 500px;
}
</style>
</head>
<body>
<div class="div1">
<h1>用户登录</h1>
<c:if test="${index == 1}">
<h1 style="color: red;">登陆失败,请重新登录</h1>
</c:if>
<c:if test="${Filter_index == 1}">
<h1 style="color: red;">你没有登录请登录</h1>
</c:if>
<form action="<c:url value="/ProcessRequest"/>" method="get">
<table class="ta1">
<tr>
<td>用户名</td> <td colspan="4"> <input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td> <td colspan="4"><input type="password" name="password"></td>
</tr>
<tr>
<td>自动登陆时间:</td>
<td>
<input type="radio" name="time" value="OneMonth">一个月
<input type="radio" name="time" value="trimester">三个月
<input type="radio" name="time" value="Half">半年
<input type="radio" name="time" value="OneYear">一年
<input type="radio" name="time" value="TwoAndAHalfYears">两年半
</td>
</tr>
<tr>
<td colspan="5"><button type="submit">登录</button> <button type="reset">重置</button> </td>
</tr>
</table>
</form>
</div>
</body>
</html>
展示界面:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/10/11
Time: 18:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
<style>
.div1{
width: 800px;
height: 300px;
border: 1px solid black;
text-align: center;
}
.div2{
margin-top: 100px;
}
</style>
</head>
<body>
<div class="div1">
<div class="div2">
<h1>欢迎光临<br></h1>
<h3>${username}</h3>
</div>
</div>
</body>
</html>
用来判断的Servlet:
package Semester_3.FilterChecking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet(name = "ProcessRequest" , value = "/ProcessRequest")
public class ProcessRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
User user = new User();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日-HH时mm分ss秒");
String time = sdf.format(date);
Cookie cookie1 = new Cookie("username",username);
Cookie cookie2 = new Cookie("mark","true");
if(username.equals(user.getUsername())){
resp.addCookie(cookie2);
resp.addCookie(cookie1);
user.setTime(time);
req.setAttribute("username",username);
req.getRequestDispatcher("/FilterChecking/index.jsp").forward(req,resp);
}else {
req.setAttribute("index",1);
req.getRequestDispatcher("/FilterChecking/login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
过滤器:
package Semester_3.FilterChecking;
import Semester_3.ShoppingCart.cookie;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/FilterChecking/index.jsp")
public class intercept implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
Cookie[] cookies = req.getCookies();
for(Cookie c : cookies){
String value = c.getName();
if(value.equals("mark")){
filterChain.doFilter(servletRequest,servletResponse);
}else {
req.setAttribute("Filter_index",1);
req.getRequestDispatcher("/FilterChecking/login.jsp").forward(req,resp);
}
}
}
@Override
public void destroy() {
}
}
用户类:
package Semester_3.FilterChecking;
public class User {
private String username = "张三";
private String time;
public User(String username, String time) {
this.username = username;
this.time = time;
}
public User() {}
public void setUsername(String username) {
this.username = username;
}
public void setTime(String time) {
this.time = time;
}
public String getUsername() {
return username;
}
public String getTime() {
return time;
}
}
注意点:
这里的判断只是简单的判断了之前设定好的用户名,在实际操作用应该是判断更复杂的选项。而且在过滤器中的拦截路径也不仅仅是一个文件,而应该是一个路径拦截或是全部拦截
简单思路:
对于过滤器检查登录的简单逻辑介绍 当我们访问login.jsp时,会显示一个登陆用的表单,当我们填写完成并提交之后,数据会发送到ProcessRequest 这个Servlet类中进行判断,如果输入的用户名符合用户类中的预先设定好的用户名,则将标记用的cookie和 用户名转发到index.jsp并展示。 如果用户名错误,则将一个标记错误信息的变量存储到请求域中,并在index.jsp中解析错误信息并显示 相应的错误信息。 如果没有登录,也就是没用通过login.jsp登陆成功直接访问index.jsp则会经过过滤器intercept,当 检测到没有标记时,也会向请求域中传入一个标记错误信息的变量,并在index.jsp中解析错误信息并显示 相应的错误信息
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153349.html