目录
四、实现防跳墙功能(防止用户不登陆,直接运行其它页面的行为)
一、了解cookie和session
Cookie实际上是一小段的文本信息。当客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。当浏览器再次请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。信息保存的时间可以根据需要设置。如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止。如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期。Cookie存储的数据量受限制,大多数浏览器支持最大容量为4K,因此不适合用来保存数据集及其他大量数据。由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的、未加密的数据,否则会影响网站的安全性。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。当客户端浏览器访问服务器时,服务器把客户端信息以某种形式记录在服务器上,这就是Session。每个用户访问服务器都会建立一个Session,服务器会自动为其分配一个SessionId来标识用户的唯一身份。
总的来说,Cookie和Session都用于跟踪用户身份,但Session更安全,因为用户信息存储在服务器端,而Cookie存储在用户计算机上,容易被窃取。同时,Session也更灵活,可以存储更多的用户信息、
二、常用的方法
Cookie usernameCookie = new Cookie("username", "john_doe");
// 设置 Cookie 的过期时间(以秒为单位)
usernameCookie.setMaxAge(3600);// 1 小时
// 设置 Cookie 的路径
usernameCookie.setPath("/");
// 发送 Cookie 给客户端
response.addCookie(usernameCookie);
Cookie[]cookies = request.getCookies();//读取Cookie
if(cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
// 处理 Cookie 数据
}
}
//使用request对象的getSession()获取session,如果session不存在则创建一个
1.HttpSessionsession = request.getSession();
//将数据存储到session中,设置属性 key ,value
2.session.setAttribute("ok","学习Java");
//获取session的Id
3.StringsessionId = session.getId();
//判断session是不是新创建的
4.session.isNew()
//获取key的值
5.getAttribute(key);
//通过key值删除数据
6.removeAttribute(String key)
//将session中的变量全部清空
7.invalidate();
//设置session失效时间,单位为秒
8.setMaxInactiveInterval(int interval);
//获取session失效时间
9.getMaxInactiveInterval();
三、验证功能
首先我们需要导入ValidateCode.jar,是实现验证功能的重点。ValidateCode validateCode = new ValidateCode(500, 200, 4, 100);
这行代码创建了一个ValidateCode对象。ValidateCode类通常用于生成验证码图片。
- 构造函数的参数解释:
500
:验证码图片的宽度。200
:验证码图片的高度。4
:验证码字符的个数。100
:验证码字符的字体大小。String code = validateCode.getCode();
调用getCode()
方法获取生成的验证码字符串。这个字符串将用于后续的验证。
HttpSession session = req.getSession();
获取当前请求的HttpSession
对象。HttpSession
用于在多个请求之间共享数据。session.setAttribute("code", code);
:将生成的验证码字符串存储到HttpSession
中,键为"code"
。这样,在后续的请求中可以通过这个键来获取验证码,用于验证用户输入的验证码是否正确。
validateCode.write(resp.getOutputStream());
调用write()
方法将生成的验证码图片写入到HttpServletResponse
的输出流中。客户端浏览器会接收到这个图片,并显示给用户。
生成的验证码效果如图所示
这样用户可以根据图片输入验证码,但是需要注意的一点,该验证码是不区分大小写的,虽然显示图片是大写,但是我们要清楚。
四、实现防跳墙功能(防止用户不登陆,直接运行其它页面的行为)
该功能的实现比较简单,但是需要搭配使用另外的API(Servlet过滤器)
Servlet 过滤器(Filter)是 Java Servlet API 提供的一种机制,用于在请求到达 Servlet 之前或在响应返回客户端之前,对请求和响应进行处理。过滤器是一种用来处理请求和响应的工具,它可以在 Servlet 容器中对请求和响应进行预处理和后处理。
所有我们可以通过使用过滤器来获取当前页面的信息,来判断是否为登陆页面,如果不是就强制其跳转到登陆页面。
实现的逻辑:在登陆页面我们已经通过用户输入的用户名和密码实现SQL查询并且拿到返回值后,我们开启一个会话session,并以键值对的形式输入任意的数据(因为我们是为了判断,并不是为了取值),然后我们从新定义一个过滤器类,继承Filter,实现其方法,我们在其doFilter方法中也开启会话,运用上述所学获取会话的内容,如果判断获取到的值是正确的,那么就说明已经登陆成功了,反之跳转到登陆页面,让其登陆。
上述是在登陆页面的一部分代码,功能是调用了tool里面自己分装的方法完成了用户前端输入的用户名和密码与数据库中保存的数据相比较功能,并返回有值,如果值不为空就开启一个会话,并跳转到展示数据页面,如果成功则跳转到失败页面。
package Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebFilter("/*")
///*代表拦截所有的服务器
public class FilterTest1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器,拦截开始!");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("客户端发来请求了");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
HttpSession session = ((HttpServletRequest) servletRequest).getSession(false);
//false的含义是,如果运行的项目中现存有session会话,就会创建一个会话,如果没有就不会创建一个新的session会话
String requestURI = ((HttpServletRequest) servletRequest).getRequestURI();
//获取用户打开的网页的地址
//如果请求的URI是某些特定的页面(如登录页面、错误页面等),则直接放行。
if (requestURI.endsWith("/login1.jsp") || requestURI.endsWith("/denglu") ||
requestURI.endsWith("/code") || requestURI.endsWith("/error") || requestURI.endsWith("/loginout") ||
requestURI.endsWith("/index.jsp") || requestURI.endsWith("/insertUser.jsp") || requestURI.endsWith("/insertuser")) {
//放行(使该页面可以进行下一步操作)
filterChain.doFilter(servletRequest, servletResponse);
} //如果会话不存在或会话中没有用户信息,则重定向到登录页面,并提示用户登录。
else if (session == null || session.getAttribute("user") == null) {
PrintWriter writer = servletResponse.getWriter();
//Java语言提供的可在Java代码中书写前端HTML代码的方式
writer.write("<script>" +
"alert('请正常登陆');" +
"window.location.href='login1.jsp'" +
"</script>");
//跳转到登陆页面
} //如果会话存在且包含用户信息,则放行请求。
else if (session != null && session.getAttribute("user") != null) {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
System.out.println("拦截结束!");
}
}
上述代码为 Servlet过滤器部分代码。