Java Web学习之Filter过滤器
今天给大家带来的是Java Web学习中的一个很重要的内容Filter过滤器,在我们之前写的Javaweb的代码中,我大多数使用jsp和servlet结合的方式实现前后台交互的功能来实现页面的数据交互,但是单单只用这jsp和servlet时我发现,就算不通过登录的界面我们也能直接的跳转到之后的界面,例如我们的登录界面是login.jsp的页面,登录成功之后是主页面是main.jsp,如果不使用过滤器等工具,那我们直接访问main.jsp也是能直接访问到主页面,那登录界面就没有起到登录的作用了。
Filter过滤器:过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理 通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理 的。
工具:IDEA2018.2.2、Tomcat 7.0.9、jdk 1.8.0 。
一、打开IDEA
1、我们先打开一个IDEA并且创建好一个JavaWeb的项目工程。
二、准备好我们需要的两个jsp页面,一个是登录的界面和另外一个登录后的界面
index.jsp
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<center>
<br><br><br><br>
<form action="/loginServlet" method="post">
<input type="text" name="username" placeholder="用户名" required autofocus><br>
<input type="password" name="password" placeholder="密码" required><br>
<button type="submit">登录</button>
</form>
</center>
</body>
</html>
在以上代码中利用form表单进行传输数据, action="/loginServlet"是向后台的loginServlet中个传递数据,method用post的方式来发送数据,required是表示这个input标签内的内容是必填的数据,autofocus表示文本输入字段被设置为当页面加载时获得焦点。
main.jsp
<%--
Created by IntelliJ IDEA.
User: abcd-
Date: 2019/7/17
Time: 21:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body><center>
<h1>登录成功</h1>
</center>
</body>
</html>
在main页面中我只写了一个登录成功过得字样来表示这个地方是登录成功的。
三、准备好一个Servlet代码
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置session域
HttpSession session=request.getSession();
//获取前端所体检的登录名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断登录名和密码是否正确 如果正确则进入主页面,不符合则回到登录界面
//如果登录成功将登陆成功的信息放到session域中取名flage
if(username.equals("admin")&&password.equals("123")){
session.setAttribute("flage",1);
response.sendRedirect("/main.jsp");
}else{
response.sendRedirect("/index.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
四、再准备好一个Filter,在src上右击在最底部选择Filter文件
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class UtilFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
/* 对req和resp进行强转,因为他们传进来是ServletRequest和ServletResponse的格式,
然而我们需要HttpServletRequest和HttpServletResponse的格式
*/
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
//设置servlet的编码格式为UTF-8
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取到session域中的数据将其拿出进行判断是否登录成功
HttpSession session=request.getSession();
Integer flage = (Integer) session.getAttribute("flage");
// 返回除去host(域名或者ip)部分的路径
String uri=request.getRequestURI();
//放行符合一下条件的页面请求,不符合则返回原来的页面
if(flage!=null||uri.contains("index.jsp")||uri.contains("loginServlet")){
chain.doFilter(req, resp);
}else{
response.sendRedirect("index.jsp");
}
}
public void init(FilterConfig config) throws ServletException {
}
}
这样我们的一个过滤器的功能就实现成功了,可以看到我们现在启动项目如果直接访问main.jsp是不能访问成功的会直接跳到登录界面,如果有其他的界面也是一样的。
代码分层结构:
项目连接
提取码: bh8z