1,本文为Java学习五部分第二部分所有项目回顾(前端练习系列-对应Java体系第二部分第三阶段内容)这些再前面的博客里没有。因为感觉把练习作业单独写出来会更好一些。
2,整体项目系列博客(包括整体快递e站系列,数据库练习系列,程序创新大会报名表系列,Javaweb系列(用户登录,快递e站),SSM系列,微服务系列,实战系列,等)还是应该刚写完作业就写博客的。本部分借鉴了作者SelcouthAI写博客的结构。
写再前面的话具体需求任务过程任务成功视频思路及代码实现
我的原理图以用户登录2.0(servlet+jsp)为基础进行分析。
一,创建数据库二,编写工具类三、 对象四、 登录注册页面五,服务端接受客户端数据六,数据处理七,登录结果页面 完整代码
一、 工具包
properties配置文件DBUtils.javaFirstFilterAttributeListener 二、 对象
lx_servlet_rewu 三,登录与注册页面
login.htmlregister.html 四,服务端接受客户端数据
web.xmlloginServletRegisterServletLogoutServlet 五,数据处理
RwdaoRwDaoImpl 六,登录结果页面
success2.jspindex.jsp
具体需求需求1:
过滤器:上一个任务中我们已经实现了登录功能以及展示功能,这里用到一个页面叫 success.jsp。当前项目中无论用户是否登录成功,都可以直接访问 success.jsp。现在新加一个需求,使用过滤器实现功能:用户在登录情况下才能访问 success.jsp 页面。
需求2:
添加一个监听器,监听 session 的变化,如果 session 每存储一次用户信息到 session,则调取监听器,监听 session
1.在登录功能中添加一个过滤器,过滤器中首先获取请求地址,如果请求地址是 success.jsp,则表示用户想访问成功页面,那就需要进行验证。
2. 验证只需要在过滤器中获取 session 中的数据,判断 session 中是否存有用户信息,有则表示用户已登录,放行即可。否则跳转到登录页面
3.配置 session 监听器类,重写监听器方法,在方法中输出 session 存值和删除值的动作描述。
后台不能上传视频,额。补一下截图。
登录界面-其实是改上面的链接依然跳回了登录界面(过滤器方法)
监听器-监听session 变化
分享一个我自己画的适用于过滤器,监听器的通用流程。
竟然和cookie与session放一起了。
cookie原理图
session原理图
Filter原理图
监听器原理图
以用户登录2.0(servlet+jsp)为基础进行分析。 一,创建数据库和之前一样
二,编写工具类主要改动部分,增加了FirstFilter和AttributeListener
FirstFilter:通过判断session里是否有用户名称来进行过滤。
@Override //请求和响应时都会执行这个方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器开始");
//处理乱码
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
request.setCharacterEncoding("utf-8");
//防止用户在未登录的情况下访问资源
String requestURI = request.getRequestURI();//获得请求地址
//System.out.println("requestURI="+requestURI);
Object username = request.getSession().getAttribute("username");
if(requestURI.endsWith("success2.jsp")&&username==null){
response.sendRedirect("login.html");
}
//调取下一个过滤器,或者调取servlet
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("过滤器结束");
}
AttributeListener:记录session每一次的变化。
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session存值,"+httpSessionBindingEvent.getName()+","+httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session清除值");
}
三、 对象
和之前一样
四、 登录注册页面哈哈,和之前一样
五,服务端接受客户端数据web.xml配置又回来了。
session的有效时间
30
filter配置
六,数据处理f1 rewu.util.FirstFilter f1 //登录成功 //session存值 HttpSession session = req.getSession(); session.setAttribute("username",username); session.setAttribute("password",password); session.setMaxInactiveInterval(60*30);//单位是秒 //重定向或者转发时,session数据是不会丢失的,重定向时,request中的数据会丢失 req.getRequestDispatcher("success2.jsp").forward(req,resp); } }
还是不变
七,登录结果页面登录失败页面变化:登录失败后可以跳转到登录页面,登录使用cookie显示了用户名。
<%
// 这一部分主要是cookie的使用
cookie[] cookies = request.getcookies();
String value ="";
if(cookies!=null&&cookies.length>0){
for (cookie cookie : cookies) {
if(cookie.getName().equals("uname")){
value = cookie.getValue();
break;
}
}
}
pageContext.setAttribute("unamecookie",value);
%>
登录
完整代码
一、 工具包
properties配置文件
driverclass=com.mysql.cj.jdbc.Driver username=print password=print url=jdbc:mysql://localhost:3306/shshop?serverTimezone=UTCDBUtils.java
package rewu.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public abstract class DBUtils {
//1.定义成员变量 DataSource
private static DataSource ds;
static{
try {
//1.加载配置文件
Properties pro = new Properties();
pro.load(DBUtils.class.getClassLoader().getResourceAsStream("db.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource(){
return ds;
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
FirstFilter
package rewu.util;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化filter");//当服务器启动时执行init
}
@Override //请求和响应时都会执行这个方法
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器开始");
//处理乱码
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
request.setCharacterEncoding("utf-8");
//防止用户在未登录的情况下访问资源
String requestURI = request.getRequestURI();//获得请求地址
//System.out.println("requestURI="+requestURI);
Object username = request.getSession().getAttribute("username");
if(requestURI.endsWith("success2.jsp")&&username==null){
response.sendRedirect("login.html");
}
//调取下一个过滤器,或者调取servlet
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("过滤器结束");
}
@Override
public void destroy() {
System.out.println("销毁filter");
}
}
AttributeListener
package rewu.util;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class AttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session存值,"+httpSessionBindingEvent.getName()+","+httpSessionBindingEvent.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session清除值");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
}
}
二、 对象
lx_servlet_rewu
package rewu.bean;
public class lx_servlet_rewu {
private int id;
private String username;
private String PASSWORD;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPASSWORD() {
return PASSWORD;
}
public void setPASSWORD(String PASSWORD) {
this.PASSWORD = PASSWORD;
}
}
三,登录与注册页面
login.html
```java
```html
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
欢迎<%=session.getAttribute("username") %>
,登录成功!!!!
register.html
表单验证
四,服务端接受客户端数据
web.xml
RegisterServlet30 f1 rewu.util.FirstFilter f1 //登录成功 //session存值 HttpSession session = req.getSession(); session.setAttribute("username",username); session.setAttribute("password",password); session.setMaxInactiveInterval(60*30);//单位是秒 //重定向或者转发时,session数据是不会丢失的,重定向时,request中的数据会丢失 req.getRequestDispatcher("success2.jsp").forward(req,resp); } } }
package rewu.servlet;
import rewu.bean.lx_servlet_rewu;
import rewu.dao.impl.RwDaoImpl;
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 java.io.IOException;
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
//2.获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("PASSWORD");
//3.封装user对象
lx_servlet_rewu loginUser = new lx_servlet_rewu();
loginUser.setUsername(username);
loginUser.setPASSWORD(password);
//4.调用UserDao的login方法
RwDaoImpl dao = new RwDaoImpl();
int user = dao.register(loginUser);
//5.返回登录
resp.sendRedirect("/login.html");
}
}
LogoutServlet
package rewu.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 java.io.IOException;
@WebServlet("/logOut")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().invalidate();//使session失效
resp.sendRedirect("login.html");
}
}
五,数据处理
Rwdao
package rewu.dao;
import rewu.bean.lx_servlet_rewu;
public interface Rwdao {
// 查询登录用户
public lx_servlet_rewu login(lx_servlet_rewu login_rewu);
// 添加登录用户
public int register(lx_servlet_rewu register_rewu);
}
RwDaoImpl
package rewu.dao.impl;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import rewu.bean.lx_servlet_rewu;
import rewu.dao.Rwdao;
import rewu.util.DBUtils;
public class RwDaoImpl implements Rwdao {
//声明JDBCTemplate对象共用
private JdbcTemplate template = new JdbcTemplate(DBUtils.getDataSource());
@Override
public lx_servlet_rewu login(lx_servlet_rewu login_rewu) {
try {
//1.编写sql
String sql = "select * from lx_servlet_rewu where username = ? and PASSWORD = ?";
//2.调用query方法
lx_servlet_rewu user = template.queryForObject(sql,
new BeanPropertyRowMapper(lx_servlet_rewu.class),
login_rewu.getUsername(), login_rewu.getPASSWORD());
return user;
} catch (DataAccessException e) {
e.printStackTrace();//记录日志
return null;
}
}
@Override
public int register(lx_servlet_rewu register_rewu) {
try {
//1.insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n);
String sql = "insert into lx_servlet_rewu(username,PASSWORD) values (?,?)";
//2.调用query方法
int user = template.update(sql,register_rewu.getUsername(),register_rewu.getPASSWORD());
return user;
} catch (DataAccessException e) {
e.printStackTrace();//记录日志
return 0;
}
}
}
六,登录结果页面
success2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
欢迎<%=session.getAttribute("username") %>
,登录成功!!!!
index.jsp
<%--
Created by IntelliJ IDEA.
User: xiaomi
Date: 2021/3/3
Time: 14:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
<%
// 这一部分主要是cookie的使用
cookie[] cookies = request.getcookies();
String value ="";
if(cookies!=null&&cookies.length>0){
for (cookie cookie : cookies) {
if(cookie.getName().equals("uname")){
value = cookie.getValue();
break;
}
}
}
pageContext.setAttribute("unamecookie",value);
%>
登录



