前提准备在之前的两篇文章中
一.登录功能的实现
1.新建一html个文件,实现登录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<!--创建一个表单,实现登录效果-->
<!--用 MyHttpServlet来处理登录,其路径/servlet
-->
<form action="/Web2_war/servlet" method="get">
用户名: <input type="text" name="username">
<br>
密码: <input type="password" name="password">
<input type="submit" value="login">
</form>
</body>
</html>
2.在MyHttpServlet.java文件中处理登录逻辑
package com.hhh.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 MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//登录逻辑
String username = req.getParameter("username");
String password = req.getParameter("password");
//假如用户为hhh,密码为123
if("hhh".equals(username)&&"123".equals(password)){
//登录成功,跳转页面(重定向)
resp.sendRedirect("/Web2_war/index.html");
}else {
//登录失败
resp.getWriter().print("login failed");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
3.新建一个需要跳转到的页面index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>成功页面</title>
</head>
<body>
<h1>成功登录!</h1>
</body>
</html>
4.启动tomcat(启动之前先把之前的过滤器注释了)
1.输入错误的用户名或密码
2.效果
3.输入正确的用户名和密码
4.效果
二.登录成功后,实现登录访问页面,未登录访问失效
1.创建其他html文件table.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>table页面</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr >
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
</tr>
<tr>
<td>哈哈哈</td>
<td>女</td>
<td>22</td>
</tr>
<tr>
<td><嘿嘿嘿</td>
<td>男</td>
<td>24</td>
</tr>
</table>
</body>
</html>
2.创建session和filter
假如需要访问table.html或index.html页面,如果没登录,提示登录失败。这边登录成功后,在MyHttpServlet中需要创建一个session,再在外边创建一个类,用来创建过滤器,在过滤器里头写有没有session的逻辑,有session就代表登录成功。
1.现在MyHttpServlet中创建一个session
2.创建一个filter,对原有的MyFilter进行书写逻辑
package com.hhh.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// System.out.println("filter ini");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//登录权限控制
//之前,需要强转为HttpServletRequest类型的servletRequest,这样才能从里头拿session
HttpServletRequest req= (HttpServletRequest) servletRequest;
//如果获取不到,表示没登录,返回null,这里参数为false
HttpSession session = req.getSession(false);
if(session==null){
//未登录
servletResponse.getWriter().print("not login");
return;
//如果未登录,执行return,程序就结束,执行不了原有逻辑
}
Object currentUser = session.getAttribute("currentUser");
System.out.println("currentUser:"+currentUser);
//只有登录成功才会执行到这,才会执行原有逻辑
filterChain.doFilter(servletRequest, servletResponse);//执行原来的逻辑,注释掉就代表拦截原有逻辑不执行
//之后
}
@Override
public void destroy() {
}
}
3.在web.xml中将原有的filter配置还原
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.hhh.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--拦截所有路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
3.运行程序
1.先运行index.html,这时未登录,访问失败。请求发起会先经过过滤器,过滤器通过之后才会到达具体资源
2.运行login.html,发现也登录失败,是因为处理逻辑部分(因为没有登录所以这里不能登录,陷入死循环)
3.修改MyFilter中的逻辑代码,把登录的请求过滤
StringBuffer requestURL = req.getRequestURL();
//这里的参数Web2_war/servlet有误,暂时不清楚填什么,逻辑往下顺没问题
if(requestURL.toString().contains("Web2_war/servlet")){
//这次请求是登录
filterChain.doFilter(servletRequest, servletResponse);
return;
}
4.程序执行后续具体
1.执行login.html,登录成功,可以访问其他table、index等页面
2.登录失败,不能访问able、index等页面
3.这里我的参数有误,无论访问哪个页面都被拦截下来,等后面了解相关知识点再进行整改。