Javaweb技术——Filter和Listener

目录

Session和Cookie

什么是会话跟踪技术

1.什么是cookie

2.Cookie的应用

3. Cookie的设置和获取

4.删除Cookie

Session

1.什么是Session

2.创建Session的格式

3.Session的生命周期

4.Session常用的方法

5.Sesssion的应用场景

6.Session和Cookie的区别

过滤器(Filter)

1.什么是过滤器

2.过滤器的语法格式

3.使用场景

监听器(Listener)

1.什么是监听器

2.监听器分类

3.监听三大域对象的创建与销毁的监听器

作业

后台部分

bean包——comment实体类

util包——JDBC实现用户信息数据库增删改查——MysqlDatabaseUse

util包——JDBC实现评论信息数据库增删改查——CommentDatabaseUse

util包——评论过滤器CommentFilter

util包——JDBC连接池——DruidUtil

util包——未登录用户访问其他页面过滤器——LoginFilter

web包——评论响应服务器——CommentServlet

web包——下载响应服务器——DownloadServlet

web包——登录响应服务器——LoginServlet

web包——退出响应服务器——LogoutServlet

web包——充值响应服务器——LogoutServlet

web包——注册响应服务器——LogoutServlet

前端部分

comment.jsp

index.jsp

Recharge.jsp

registration.jsp

Welcome.jsp

文件树


Session和Cookie

什么是会话跟踪技术

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。保持对用户会话期间的数据管理。常用的会话跟踪技术是Cookie与Session。

Cookie通过在客户端记录信息确定用户身份

Session通过在服务器端记录信息确定用户身份。

1.什么是cookie

Cookie是客户端(一般指浏览器)请求服务器后,服务器发给客户端的一个辨认标识,保存在客户端,当客户端再次 向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。

Cookie的作用:跟踪会话,记录一次会话中(即Session,一次会话可能会有多次请求,当然也可以有多个Cookie来跟踪不同的信息)的信息,这样服务器就会知道用户的状态,比如有没有登录成功,付款时购物车中的东西等,就相当于贴在客户端脑门上的纸条,浏览器看不到,但服务器看得到。

2.Cookie的应用

2.1 保持用户登录状态

将用户的信息保存到Cookie中,并发送给浏览器,并且将有效时间设置为一个较长的时间,这样浏览器在以后访问网站时,都会带着该Cookie,服务器以此来辨识用户,用户就不再需要输入用户名和密码等信息。

2.2 记录用户名

一旦用户登录成功以后,下次再登录时,直接将Cookie中的用户名读取并显示出来,这样用户就不需要再次输入用户名,只输入密码即可。

3. Cookie的设置和获取

3.1 、通过HttpServletResponse.addCookie的方式设置Cookie

注意:new Cookie()时两个参数都是字符串

 

 

Cookie cookie = new Cookie("jieguo","true"); 
response.addCookie(cookie);

3.2、浏览器中查看cookie的内容

3.3、服务端获取客户端携带的cookie:通过HttpServletRequest获取

 

 

 
<% 
Cookie[] cookies = request.getCookies(); 
if(cookies != null) 
for(Cookie c : cookies){ 
String name = c.getName();//获取Cookie名称 
if("jieguo".equals(name)){ 
String value = c.getValue();//获取Cookie的值 
bool = Boolean.valueOf(value);//将值转为Boolean类型 
} 
} 
%>

示例

 

 

 
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.创建cookie
    Cookie cookie = new Cookie("c1","cookieTest");
    //2.响应给客户端
    resp.addCookie(cookie);
    //3.跳转页面
    resp.sendRedirect("show.jsp");
}
 

 

 
<%--        将cookie值输出到页面中--%>
        <%
//            使用request来获取cookies
           Cookie[] cookies = request.getCookies();
           if (cookies!=null){
               for (int i = 0;i<cookies.length;i++){
                   out.print("cookie="+cookies[i].getName()+",cookieValue="+cookies[i].getValue());
               }
           }
        %>

4.删除Cookie

通过设置同名Cookie的最大存活时间为0,删除Cookie是指使浏览器不再保存Cookie,使Cookie立即失效

举例:使name为username的Cookie立即失效

 

 

 
//1.创建一个name为username的Cookie 
Cookie cookie = new Cookie("username", "aaa"); 
//2.设置Cookie的有效时间为0 
cookie.setMaxAge(0);//删除cookie的关键 
//3.将cookie发送给浏览器,来替换同名Cookie 
response.addCookie(cookie);

Cookie的有效时间

Cookie发送给浏览器以后,浏览器并不会永久保存,也就是到了一定的时间以后浏览器会自动销毁Cookie。

Cookie的默认有效时间为一次会话(一次打开关闭浏览器的过程),我们也可以手动指定Cookie的有效时间

 

 

 
//setMaxAge用来设置Cookie的最大有效时间,需要int型的参数,代表有效的秒数 
cookie.setMaxAge(秒数); 
//当参数大于0时,会设置为指定的秒数 
cookie.setMaxAge(30); 
//当参数等于0时,浏览器不会保存Cookie,Cookie立即失效 
cookie.setMaxAge(0); 
//当参数小于0时,和不设置是一样,当前会话有效 
cookie.setMaxAge(-100); 
//设置一个永久有效的Cookie,并非永久,只是使Cookie的生命很长而已 
cookie.setMaxAge(60*60*24*365*10); 

Session

1.什么是Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询 客户档案表就可以了。

2.创建Session的格式

Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。

Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的 Session

例如:

 

 

 
HttpSession session = request.getSession(); // 获取Session对象 
session.setAttribute("loginTime", new Date()); // 设置Session中的属性 
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性

3.Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立 的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只 访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服 务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过 setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。

 

 

 
<session-config> 
<session-timeout>30</session-timeout> 
</session-config>

4.Session常用的方法

5.Sesssion的应用场景

代码演示:1.登录 2.退出(创建Session和消除Session)

6.Session和Cookie的区别

(1) Cookie数据保存在客户端,Session数据保存在服务器端。

(2) Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

(3) Cookies是属于Session对象的一种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者一个Cookie的文本文件中;而Session则会占用服务器资源。所以,尽量不要使用Session,而使用Cookies。但是我们 一般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可见性且易于本地编辑性,往往可以引起很多的安全问题Session是可靠地。但是目前很多著名的站点也都用Cookie.

过滤器(Filter)

1.什么是过滤器

过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理

2.过滤器的语法格式

2.1.创建一个类实现Filter接口

 

 

 
public class CharSetFilter implements Filter{}

2.2.重写接口中的方法

 

 

 
public void destroy() { //销毁的方法} 
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws 
ServletException, IOException { 
//过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处 
chain.doFilter(req, resp); 
}
public void init(FilterConfig config) throws ServletException { 
/*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/ 
}

2.3.在web.xml文件中配置

 

 

 
<filter>
<filter-name>过滤器名称</filter-name> 
<filter-class>过滤器所在的路径</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>过滤器名称</filter-name> 
<url-pattern>需要过滤的资源</url-pattern> 
</filter-mapping>

3.使用场景

3.1.如何防止用户未登录就执行后续操作

 

 

 
String name=(String)session.getAttribute("key"); 
if(name==null){ 
//跳转到登录页面 
}

3.2.设置编码方式--统一设置编码

3.3.加密解密(密码的加密和解密)

3.4.非法文字筛选

3.5.下载资源的限制

过滤器的特点:在servlet之前和之后都会被执行

监听器(Listener)

1.什么是监听器

监听器就是监听某个域对象的的状态变化的组件

监听器的相关概念:

事件源:被监听的对象(三个域对象request、session、servletContext)

监听器:监听事件源对象事件源对象的状态的变化都会触发监听器

注册监听器:将监听器与事件源进行绑定

响应行为:监听器监听到事件源的状态变化时所涉及的功能代码(程序员编写代码)

2.监听器分类

第一维度按照被监听的对象划分:ServletRequest域、HttpSession域、ServletContext域第二维度按照监听的内 容分:监听域对象的创建与销毁的、监听域对象的属性变化的

3.监听三大域对象的创建与销毁的监听器

监听器的编写步骤(重点):

  • 编写一个监听器类去实现监听器接口

  • 覆盖监听器的方法

  • 需要在web.xml中进行配置—注册

 

 

 
<listener> 
<listener-class>监听器所在的路径</listener-class> 
</listener>

ServletContextListener :监听ServletContext域的创建与销毁的监听器

Servlet域的生命周期

  • 何时创建:服务器启动创建

  • 何时销毁:服务器关闭销毁

ServletContextListener监听器的主要作用

  • 初始化的工作:初始化对象、初始化数据(加载数据库驱动、连接池的初始化) 加载一些初始化的配置文件 (spring的配置文件) 任务调度(定时器—Timer/TimerTask)

HttpSessionListener :监听Httpsession域的创建和销毁的监听器

HttpSession对象的生命周期

  • 何时创建:第一次调用request.getSession时创建

  • 何时销毁:服务器关闭销毁、session过期(默认30分钟,修改 默认的30分钟是在Tomcat的web.xml,修改当前项目的过期时间是在自己项目的web.xml中)、手动销毁

HttpSessionListener监听器的主要作用:

由于每次访问网站都会默认创建session对象(jsp页面中page指令中的session属性默认为true,即被访问时创建session),可以用于计数网站访问过的人

ServletRequestListener:监听ServletRequest域创建与销毁的监听器

ServletRequest的生命周期

  • 创建:每一次请求都会创建request

  • 销毁:请求结束

用法同上,用处不是很大,此处省略。

作业

后台部分

bean包——comment实体类

 

 

package bean;
import java.util.Objects;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-12 15:46
 */
public class Comment {
    private String commentator;
    private String content;
    public Comment(String commentator, String content) {
        this.commentator = commentator;
        this.content = content;
    }
    public String getCommentator() {
        return commentator;
    }
    public void setCommentator(String commentator) {
        this.commentator = commentator;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Comment comment = (Comment) o;
        return commentator.equals(comment.commentator) &&
                content.equals(comment.content);
    }
    @Override
    public int hashCode() {
        return Objects.hash(commentator, content);
    }
    @Override
    public String toString() {
        return "comment{" +
                "commentator='" + commentator + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

util包——JDBC实现用户信息数据库增删改查——MysqlDatabaseUse

 

 

package util;
import java.sql.*;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 16:04
 */
public class MysqlDatabaseUse {
    Statement statement = null;
    ResultSet result;
    /**
     * @return
     * @Author 李梓豪
     * @Description 创建对象时就建立表格
     * @Date 2020年11月11日  16:11:54
     * @Param * @param null
     * @Date Modify in 2020年11月11日  16:11:54
     * @Modify Content:
     **/
    public MysqlDatabaseUse(Connection connection) {
        Statement statement = null;
        try {
            statement = connection.createStatement();
            statement.execute("CREATE TABLE  if not exists Filter(account varchar(20) not null primary key,password varchar(20),score int)engine=innodb default charset=utf8;");
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            System.out.println("用户信息表格创建失败");
        }
        System.out.println("用户信息表格创建成功");
    }
    public boolean loginSelect(Connection connection, String userName, String userPassword) {
        String uName = "";
        String uPass = "";
        System.out.println("开始查询");
        try {
            statement = connection.createStatement();
            result = statement.executeQuery("select * from filter");
            while (result.next()) {
                uName = result.getString("account");
                uPass = result.getString("password");
                if (uName.equals(userName) && uPass.equals(userPassword)) {
                    return true;
                }
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                statement.close();
            } catch (SQLException throwable) {
                throwable.printStackTrace();
            }
        }
        return false;
    }
    public boolean registrationSelect(Connection connection, String account) {
        String acc = "";
        System.out.println("开始查询");
        try {
            statement = connection.createStatement();
            result = statement.executeQuery("select * from Filter;");
            System.out.println("获取已注册用户列表成功");
            while (result.next()) {
                acc = result.getString("account");
                if (acc.equals(account)) {
                    return true;
                }
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        } finally {
            try {
                statement.close();
            } catch (SQLException throwable) {
                throwable.printStackTrace();
            }
        }
        return false;
    }
    public boolean insert(Connection conn, String account, String password) {
        PreparedStatement preStatement;
        try {
            //预编译,解决SQL注入问题
            preStatement = conn.prepareStatement("insert into Filter values(?,?,null);");
            preStatement.setString(1, account);
            preStatement.setString(2, password);
            preStatement.executeUpdate();
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            return false;
        }
        return true;
    }
    public int getScore(Connection conn, String userName, String userPassword) {
        System.out.println("开始获取积分值");
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("select * from Filter;");
            while (result.next()) {
                String uName = result.getString("account");
                String uPass = result.getString("password");
                int score = result.getInt("score");
                if (uName.equals(userName) && uPass.equals(userPassword)) {
                    return score;
                }
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return 0;
    }
    public boolean addScore(Connection conn,String rechargeAccount, String rechargePassword,int money) {
        System.out.println("开始更新积分值");
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("select * from Filter;");
            while (result.next()) {
                String uName = result.getString("account");
                String uPass = result.getString("password");
                int score = result.getInt("score");
                if (uName.equals(rechargeAccount) && uPass.equals(rechargePassword)) {
                    score += money;
                    statement.executeUpdate("update filter set score = "+score+"");
                    return true;
                }
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return false;
    }
    public boolean minusScore(Connection conn,String rechargeAccount, String rechargePassword,int money) {
        System.out.println("开始扣除积分值");
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("select * from Filter;");
            while (result.next()) {
                String uName = result.getString("account");
                String uPass = result.getString("password");
                int score = result.getInt("score");
                if (uName.equals(rechargeAccount) && uPass.equals(rechargePassword)) {
                    score -= money;
                    statement.executeUpdate("update filter set score = "+score+"");
                    return true;
                }
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return false;
    }
}

util包——JDBC实现评论信息数据库增删改查——CommentDatabaseUse

 

 

package util;
import bean.Comment;
import java.sql.*;
import java.util.ArrayList;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-12 15:27
 */
public class CommentDatabaseUse {
    Statement statement = null;
    ResultSet result;
    ArrayList<Comment> list = new ArrayList();
    public CommentDatabaseUse(Connection connection) {
        try {
            statement = connection.createStatement();
            statement.execute("CREATE TABLE  if not exists Comment(account varchar(20) not null ,comment varchar(255))engine=innodb default charset=utf8;");
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            System.out.println("评论信息表格创建失败");
        }
    }
    public boolean insert(Connection conn,String account,String content){
        PreparedStatement preStatement;
        try {
            //预编译,解决SQL注入问题
            preStatement = conn.prepareStatement("insert into Comment values(?,?);");
            preStatement.setString(1, account);
            preStatement.setString(2, content);
            preStatement.executeUpdate();
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            return false;
        }
        return true;
    }
    public ArrayList commentShow(){
        try {
            result = statement.executeQuery("select * from Comment");
            while (result.next()){
                String account = result.getString("account");
                String content = result.getString("comment");
                list.add(new Comment(account,content));
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return list;
    }
}

util包——评论过滤器CommentFilter

 

 

package util;
import bean.Comment;
import java.sql.*;
import java.util.ArrayList;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-12 15:27
 */
public class CommentDatabaseUse {
    Statement statement = null;
    ResultSet result;
    ArrayList<Comment> list = new ArrayList();
    public CommentDatabaseUse(Connection connection) {
        try {
            statement = connection.createStatement();
            statement.execute("CREATE TABLE  if not exists Comment(account varchar(20) not null ,comment varchar(255))engine=innodb default charset=utf8;");
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            System.out.println("评论信息表格创建失败");
        }
    }
    public boolean insert(Connection conn,String account,String content){
        PreparedStatement preStatement;
        try {
            //预编译,解决SQL注入问题
            preStatement = conn.prepareStatement("insert into Comment values(?,?);");
            preStatement.setString(1, account);
            preStatement.setString(2, content);
            preStatement.executeUpdate();
        } catch (SQLException throwable) {
            throwable.printStackTrace();
            return false;
        }
        return true;
    }
    public ArrayList commentShow(){
        try {
            result = statement.executeQuery("select * from Comment");
            while (result.next()){
                String account = result.getString("account");
                String content = result.getString("comment");
                list.add(new Comment(account,content));
            }
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return list;
    }
}

util包——JDBC连接池——DruidUtil

 

 

package util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 15:51
 */
public class DruidUtil {
    private static DataSource ds;
    static {
        try {
            Properties ppt = new Properties();
            ppt.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(ppt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 从连接池中取出一个连接给用户
     *
     * @return
     */
    public static Connection getConnection() {
        try {
            return ds.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }
    public static void close(Connection conn, Statement state, ResultSet rs) {
        try {
            rs.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
        try {
            state.close();
        } catch (Exception throwable) {
            throwable.printStackTrace();
        }
        try {
            conn.close();
        } catch (Exception throwable) {
            throwable.printStackTrace();
        }
    }
    public static void close(Connection conn, Statement state) {
        try {
            state.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
        try {
            conn.close();
        } catch (Exception throwables) {
            throwables.printStackTrace();
        }
    }
}

util包——未登录用户访问其他页面过滤器——LoginFilter

 

 

package util;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 14:55
 */
@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化loginFilter");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("loginFilter开始执行");
        //处理所有servlet乱码
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("utf-8");
        //发送内容的编码
        response.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        response.setContentType("text/html;charset=utf-8;");
        String account = (String) request.getSession().getAttribute("account");
        System.out.println(account);
        //获得请求地址
        String requestURI = request.getRequestURI();
        System.out.println("requestURI"+requestURI);
        //对某些资源放行(用户未登录的情况下可以访问的资源,或session有值的情况下可以访问)
        //String string = "/";
        if (    requestURI.endsWith("/")||
                requestURI.endsWith("/login") ||
                requestURI.endsWith("/index")||
                requestURI.endsWith("/index.jsp")||
                requestURI.endsWith("/registration")||
                requestURI.endsWith("/registration.jsp")||account!=null
        ) {
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            PrintWriter writer = response.getWriter();
            writer.print("<script type=\"text/javascript\">alert('请登录');location.href='/index.jsp'</script>");
            writer.close();
        }
    }
    @Override
    public void destroy() {
        System.out.println("销毁loginFilter");
    }
}

web包——评论响应服务器——CommentServlet

 

 

package web;
import util.CommentDatabaseUse;
import util.DruidUtil;
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;
import java.io.PrintWriter;
import java.sql.Connection;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-12 15:18
 */
@WebServlet(value = "/addComment")
public class CommentServlet extends HttpServlet {
    Connection conn = DruidUtil.getConnection();
    CommentDatabaseUse commentDatabaseUse = new CommentDatabaseUse(conn);
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //接收参数的编码
        req.setCharacterEncoding("utf-8");
        //发送内容的编码
        resp.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        resp.setContentType("text/html;charset=utf-8;");
        //JDBC部分
        //1.接收参数
        String commentator = (String) req.getSession().getAttribute("account");
        String comment = req.getParameter("content");
        //2.将内容插入到数据库中
        boolean insert = commentDatabaseUse.insert(conn,commentator,comment);
        PrintWriter writer = resp.getWriter();
        if (insert){
            writer.print("<script>alert('评论成功');location.href='/comment.jsp'</script>");
        }else {
            writer.print("<script>alert('评论失败,后台数据插入失败,请联系后台管理员');location.href='/comment.jsp'</script>");
        }
        writer.close();
    }
}

web包——下载响应服务器——DownloadServlet

 

 

package web;
import util.DruidUtil;
import util.MysqlDatabaseUse;
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;
import java.io.PrintWriter;
import java.sql.Connection;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 22:55
 */
@WebServlet(value = "/download")
public class DownloadServlet extends HttpServlet {
    Connection conn = DruidUtil.getConnection();
    MysqlDatabaseUse mysqlDatabaseUse = new MysqlDatabaseUse(conn);
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //接收参数的编码
        req.setCharacterEncoding("utf-8");
        //发送内容的编码
        resp.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        resp.setContentType("text/html;charset=utf-8;");
        //JDBC部分
            //1.获取账户,密码,积分参数
        String uName = (String) req.getSession().getAttribute("account");
        String uPass = (String) req.getSession().getAttribute("password");
        int beforeDownloadScore = (int) req.getSession().getAttribute("score");
        PrintWriter writer = resp.getWriter();
        int num = 100;
        if (beforeDownloadScore>=num){
            int minusMoney = 100;
            boolean updateSucceed = mysqlDatabaseUse.minusScore(conn,uName,uPass,minusMoney);
            if (updateSucceed){
                writer.write("<script type=\"text/javascript\">alert('下载成功,正在跳转到评论页面');location.href='/comment.jsp'</script>");
                int afterDownloadScore = mysqlDatabaseUse.getScore(conn,uName,uPass);
                req.getSession().setAttribute("score",afterDownloadScore);
            }else {
                writer.write("<script type=\"text/javascript\">alert('更新数据库失败');location.href='/welcome.jsp'</script>");
            }
        }else{
            writer.print("<script type=\"text/javascript\">alert('你的积分不足,请充值,正在跳转充值页面');location.href='/Recharge.jsp'</script>");
        }
        writer.close();
    }
}

web包——登录响应服务器——LoginServlet

 

 

 
package web;
import util.DruidUtil;
import util.MysqlDatabaseUse;
import javax.servlet.ServletConfig;
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.io.PrintWriter;
import java.sql.Connection;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 14:55
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    Connection conn = DruidUtil.getConnection();
    MysqlDatabaseUse mysqlDatabaseUse = new MysqlDatabaseUse(conn);
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //接收参数的编码
        req.setCharacterEncoding("utf-8");
        //发送内容的编码
        resp.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        resp.setContentType("text/html;charset=utf-8;");
        //接收参数
        String uName = req.getParameter("uName");
        String uPass = req.getParameter("uPass");
        System.out.println("登录帐号:" + uName);
        System.out.println("登录密码:" + uPass);
        System.out.println("正在访问数据库");
        //JDBC部分
        boolean loginSucceed = mysqlDatabaseUse.loginSelect(conn, uName, uPass);
        int score = mysqlDatabaseUse.getScore(conn,uName,uPass);
        PrintWriter writer = resp.getWriter();
        if (loginSucceed) {
            req.getSession().setAttribute("account",uName);
            req.getSession().setAttribute("password",uPass);
            req.getSession().setAttribute("score",score);
            writer.print("<script type=\"text/javascript\">alert('登录成功,正在跳转欢迎页面'); location.href='/welcome.jsp' </script>");
        } else {
            writer.print("<script type=\"text/javascript\">alert('登录失败,请检查帐号密码是否有误后重新登录,正在返回登录页面'); location.href='/index.jsp' </script>");
        }
        writer.close();
    }
    @Override
    public void destroy() {
        System.out.println("LoginServlet已销毁");
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("LoginServlet初始化");
    }
}

web包——退出响应服务器——LogoutServlet

 

 

package web;
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 javax.swing.text.html.HTML;
import java.io.IOException;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-12 22:48
 */
@WebServlet(value = "/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让session失效
        HttpSession session = req.getSession();
        session.invalidate();//让所有的session失效
        //返回登录页面
        resp.sendRedirect("index.jsp");
    }
}

web包——充值响应服务器——LogoutServlet

 

 

package web;
import util.DruidUtil;
import util.MysqlDatabaseUse;
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;
import java.io.PrintWriter;
import java.sql.Connection;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 22:22
 */
@WebServlet(value = "/recharge")
public class RechargeServlet extends HttpServlet {
    Connection conn = DruidUtil.getConnection();
    MysqlDatabaseUse mysqlDatabaseUse = new MysqlDatabaseUse(conn);
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
        //接收参数的编码
        req.setCharacterEncoding("utf-8");
        //发送内容的编码
        resp.setCharacterEncoding("utf-8");
        // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
        resp.setContentType("text/html;charset=utf-8;");
        //接收参数
        int money = Integer.parseInt(req.getParameter("money"));
        String rechargeAccount = req.getParameter("rechargeAccount");
        String rechargePassword = req.getParameter("rechargePassword");
        //数据库后台充值增加积分
        boolean updateSucceed = mysqlDatabaseUse.addScore(conn,rechargeAccount,rechargePassword,money);
        PrintWriter writer = resp.getWriter();
        if (updateSucceed){
            int score = mysqlDatabaseUse.getScore(conn,rechargeAccount,rechargePassword);
            req.getSession().setAttribute("score",score);
            writer.print("<script>alert('充值成功');location.href='/welcome.jsp'</script>");
        }else{
            writer.print("<script>alert('充值失败');location.href='/welcome.jsp'</script>");
        }
        writer.close();
    }
}

web包——注册响应服务器——LogoutServlet

 

 

package web;
import util.DruidUtil;
import util.MysqlDatabaseUse;
import javax.servlet.ServletConfig;
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;
import java.io.PrintWriter;
import java.sql.Connection;
/**
 * @Author: 李梓豪
 * @Description:
 * @Date Created in 2020-11-11 15:41
 */
@WebServlet(value = "/registration")
public class RegistrationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接收参数的编码和发送内容的编码
            //接收参数的编码
            req.setCharacterEncoding("utf-8");
            //发送内容的编码
            resp.setCharacterEncoding("utf-8");
                 // 配合<script type="text/javascript">使用,防止后台输出到前端的代码乱码
            resp.setContentType("text/html;charset=utf-8;");
        //接收参数
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        System.out.println("注册帐号:"+account);
        System.out.println("注册密码:"+password);
        System.out.println("正在访问数据库");
        //JDBC部分
        Connection conn = DruidUtil.getConnection();
        MysqlDatabaseUse mysqlDatabaseUse = new MysqlDatabaseUse(conn);
        boolean exist = mysqlDatabaseUse.registrationSelect(conn, account);
        PrintWriter writer = resp.getWriter();
        if (exist){
            //帐号已存在
            writer.write("<script type=\"text/javascript\">alert('帐号已注册,正在返回登录页面,请登录'); location.href='/index.jsp'</script>");
        }else{
            boolean insert = mysqlDatabaseUse.insert(conn, account, password);
            if (insert){
                //注册成功
                writer.write("<script type=\"text/javascript\">alert('注册成功,正在返回登录页面,请登录'); location.href='/index.jsp'</script>");
            }else{
                //数据库更新失败
                writer.write("<script type=\"text/javascript\">alert('数据插入数据库失败,请联系后台管理员,正在返回登录页面); location.href='/index.jsp'</script>");
            }
        }
        writer.close();
    }
    @Override
    public void destroy() {
        System.out.println("RegistrationServlet已销毁");
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("RegistrationServlet初始化");
    }
}

前端部分

comment.jsp

 

 

<%@ page import="java.util.ArrayList" %>
<%@ page import="util.CommentDatabaseUse" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="util.DruidUtil" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/12 0012
  Time: 10:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1></h1>
        <h3>3s后自动开始下载文件</h3>
        <a href="下载完成点击此处,为你返回欢迎界面"></a><br>
        <form action="/addComment" method="post">
            输入您的建议:<input type="text" name="content"/><br>
            <input type="submit" value="评论"/><br>
        </form>
        <%
            Connection conn = DruidUtil.getConnection();
            CommentDatabaseUse commentDatabaseUse = new CommentDatabaseUse(conn);
            ArrayList showList = commentDatabaseUse.commentShow();
            request.setAttribute("commentList",showList);
        %>
        <c:forEach items="${commentList}" var="comment">
            ${comment.commentator}:${comment.content};<br>
        </c:forEach>
    </body>
</html>

index.jsp

 

 

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 14:54
  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>
    <h1 align="center">登录页面</h1>
    <form method="post" action="/login">
      用户名:<input type="text" name="uName"><br>
      密码:<input type="password" name="uPass"><br>
      <input type="submit" value="登录">
<%--      点击注册按钮跳转到注册界面--%>
      <input type="button" value="注册" οnclick="location.href ='registration.jsp'">
    </form>
  </body>
</html>

Recharge.jsp

 

 

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 21:32
  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>
        <h1>充值界面</h1>
        <form method="post" action="/recharge">
            充值金额:<input type="text" name="money"/><br>
            充值的帐号:<input type="text" name="rechargeAccount"/><br>
            确认密码:<input type="password" name="rechargePassword"/><br>
            <input type="submit" value="确认充值">
        </form>
    </body>
</html>

registration.jsp

 

 

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 15:18
  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>
        <h1 align="center">注册界面</h1>
        <form action="/registration" name="myform" method="post" οnsubmit="return doSubmit()">
            帐号:<input type="text" name="account" οnblur="checkAccount()"/>
            <span style="font-size:8px;color:#ddd;" id="s1">6~18位的有效字符(字母、数字、下划线)</span><br/><br/>
            密码:<input type="password" name="password" οnblur="checkPassword()"/>
            <span style="font-size: 8px;color: #ddd;" id="s2">请输入6-18位任意字符的密码</span><br/><br/>
            请确认密码:<input type="password" name="confirmPassword" οnblur="checkConfirmPassword()"/>
            <span style="font-size:8px;color:#ddd;" id="s3"></span><br/><br/>
            <button type="submit" value="" style="width: 50px; height: 30px;">提交</button>
            <button type="reset" value="" style="width: 50px; height: 30px;">重置</button>
        </form>
    </body>
    <script>
        const s1 = document.getElementById("s1");
        const s2 = document.getElementById("s2");
        const s3 = document.getElementById("s3");
        function spanColor(colors) {
            document.getElementById(colors).style.color="red";
        }
        //表单提交事件处理程序
        function doSubmit() {
            if(checkAccount()&&checkPassword()&&checkConfirmPassword()){
                return true;
            }else {
                return false;
            }
        }
        //验证帐号
        function checkAccount() {
            const account = document.myform.account.value;
            const reg = /^[0-9A-Za-z_]{6,18}$/;
            const red = spanColor("s1");
            if(account ===""){
                s1.innerText="请输入帐号";
                red;
                return false;
            }else if (account.length<6&&account.length>18){
                s1.innerText="长度错误,长度应为6-18个字符"
                red;
                return false;
            }else if(!reg.test(account)){
                s1.innerText="字符错误,必须有效字符(字母、数字、下划线组成)"
                red;
                return false;
            }
            else {
                s1.innerText ="";
                return true;
            }
        }
        //验证密码
        function checkPassword() {
            const password = document.myform.password.value;
            const re = /^.{6,18}$/;
            const red = spanColor('s2');
            if(password ===""){
                s2.innerText="请输入密码";
                red;
                return false;
            }
            else if (password.length < 6 ||password.length > 18){
                s2.innerText="格式错误,长度应为6-18个字符";
                red;
                return false;
            }
            else if (re.test(password)){
                s2.innerText ="";
                return true;
            }
        }
        //验证确认密码
        function checkConfirmPassword() {
            const red = spanColor("s3");
            const password = document.myform.password.value;
            const confirmPassword = document.myform.confirmPassword.value;
            if(confirmPassword===""){
                s3.innerText="请输入确认密码";
                red ;
                return false;
            }
            else if(password !== confirmPassword){
                s3.innerText="两次密码输入不一致";
                red ;
                return false;
            }
            else {
                s3.innerText ="";
                return true;
            }
        }
    </script>
</html>

Welcome.jsp

 

 

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/11/11 0011
  Time: 21:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1 align="center">欢迎界面</h1>
        <h3>欢迎${account}回来,您的积分为:${score}</h3>
        <c:if test="${score>=100}">
            <form method="post" action="/download">
                <input type="submit" value="下载">
            </form>
        </c:if>
        <a href="Recharge.jsp">充值</a><br>
        <a href="/logout">退出</a>
    </body>
</html>

文件树

![](https://gitee.com/yongliao/Image/raw/master/img/image-20201113172908245.png)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值