Servlet的应用(含过滤器)

3 篇文章 0 订阅
1 篇文章 0 订阅

 

要求:

1、使用MVC(JavaBean + JSP + Servlet)模式实现实验三的功能,具体要求如下:

(1) login.jsp:登录页面(假定合法的用户名均以“ahpu_”开头,密码均为“123”),其提交到名为LoginServlet的Servlet。

(2) 在LoginServlet中检查用户名和密码,若合法则转发到messageBoard.jsp。

(3) messageBoard.jsp:留言板页面,其提交到名为MessageServlet的Servlet。

(4) 在MessageServlet中将留言信息对应的Message对象加入application,并转发到showMessage.jsp。

(5) showMessage.jsp:留言列表页面,其以表格呈现application中所有的留言。

(6) 编写名为LoginChecker的过滤器(Filter)实现“若未经过登录,则禁止访问除login.jsp和LoginServlet之外的所有URL”的功能。

web.xml(配置)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--login Servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <!--message servlet-->
    <servlet>
        <servlet-name>MessageServlet</servlet-name>
        <servlet-class>servlet.MessageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MessageServlet</servlet-name>
        <url-pattern>/Message</url-pattern>
    </servlet-mapping>

    <!--filter 配置信息-->
    <filter>
        <filter-name>loginChecker</filter-name>
        <filter-class>filter.LoginChecker</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>loginPage</param-name>
            <param-value>/login.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>LoginServlet</param-name>
            <param-value>/login</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>loginChecker</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>









 

Message.java

package bean;

/**
 * @Author: WQ
 * @Date: 2019/4/28 15:23
 * @Version
 */
public class Message {
    private String who;
    private String title;
    private String content;
    private String when;

    public String getWho() {
        return who;
    }

    public void setWho(String who) {
        this.who = who;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content.replace("<", "&lt;").replace(">", "&gt;").replace("\"", "&quot;");
    }

    public String getWhen() {
        return when;
    }

    public void setWhen(String when) {
        this.when = when;
    }
}

login.jsp

<%--
  Created by IntelliJ IDEA.
  User: 19855
  Date: 2019/4/28
  Time: 15:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    <title>登录</title>
</head>

<body class="container mt-3">
<!-- 显示登录错误信息 -->
<%
    String err = (String)request.getAttribute("LOGIN_ERR");
    if(err != null) {
        out.write("<div class='alert alert-danger'>" + err + "</div>");
    }
%>
<form action="login" method="post">
    <div class="card border-success">
        <div class="card-header bg-success">登录信息</div>
        <div class="card-body">
            <div class="form-group">
                <label>用户名</label>
                <input type="text" class="form-control" name="username"/>
            </div>
            <div class="form-group">
                <label>密码</label>
                <input type="password" class="form-control" name="password"/>
            </div>
        </div>
        <div class="card-footer">
            <input type="submit" class="btn btn-primary float-right" value="登录" />
            <input type="reset" class="btn btn-danger float-right mr-3" value="重置" />
        </div>
    </div>
</form>
</body>
</html>

LoginServlet.java

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Author: WQ
 * @Date: 2019/4/28 15:07
 * @Version
 */
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("username");
        String psw = request.getParameter("password");
        boolean success = false; // 登录是否成功
        HttpSession session = request.getSession();

        if (name == null || !name.startsWith("ahpu_") || name.length() < 6 || name.length() > 12) {
            request.setAttribute("LOGIN_ERR", "用户名格式错误");
        } else if (!"123".equals(psw)) {
            request.setAttribute("LOGIN_ERR", "密码错误");
        } else {
            success = true;
        }

        if (!success) {
            request.getRequestDispatcher("login.jsp").forward(request, response); // 转发到登录界面
        } else {
            session.setAttribute("LOGIN_USER", name); // 保存用户名到session
            request.getRequestDispatcher("messageBoard.jsp").forward(request,response);
        }

    }
}

messageBoard.jsp

<%--
  Created by IntelliJ IDEA.
  User: 19855
  Date: 2019/4/28
  Time: 15:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    <title>编辑留言</title>
</head>

<body class="container mt-3">
<form method="post" action="Message">

    <div class="card border-primary">
        <div class="card-header bg-primary">编辑留言</div>
        <div class="card-body">
            <div class="form-group">
                <label>标题</label>
                <input type="text" class="form-control" name="title"/>
            </div>
            <div class="form-group">
                <label>内容</label>
                <textarea class="form-control" name="content"></textarea>
            </div>
        </div>
        <div class="card-footer">
            <input type="submit" class="btn btn-primary float-right" value="提交" />
        </div>
    </div>
</form>
</body>
</html>

MessageServlet.java

package servlet;

import bean.Message;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Author: WQ
 * @Date: 2019/4/28 15:22
 * @Version
 */
public class MessageServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        ServletContext application = request.getServletContext();

        String title = request.getParameter("title");
        String content = request.getParameter("content");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time  = sdf.format(new Date());

        if (title == null || title.trim().length() < 1 || content == null || content.trim().length() < 1) {
            out.write("<div class='alert alert-danger'>请输入留言的标题和内容</div>");
            return;
        }

        Message m = new Message();
        m.setWho((String)session.getAttribute("LOGIN_USER"));
        m.setTitle(title.trim());
        m.setContent(content.trim());
        m.setWhen(time);

        List<Message> msgs = (List<Message>)application.getAttribute("MSGS");
        if(msgs == null) { // 首次进入此页面时成立
            msgs = new ArrayList<Message>();
            application.setAttribute("MSGS", msgs);
        }
        msgs.add(m); // 留言信息加入application
        response.sendRedirect("showMessage.jsp");//重定向到showMessage.jsp页面
    }

}

showMessage.jsp

<%--
  Created by IntelliJ IDEA.
  User: 19855
  Date: 2019/4/28
  Time: 15:27
  To change this template use File | Settings | File Templates.
--%>
<%@page import="bean.Message"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" />
    <title>留言列表</title>
</head>

<body class="container mt-3">
<%
    List<Message> msgs = (List<Message>)application.getAttribute("MSGS");
%>
<div class="card border-info">
    <div class="card-header bg-info">留言列表</div>
    <div class="card-body">
        <table class="table table-striped table-hover">
            <thead>
            <tr>
                <th scope="col">#</th>
                <th scope="col">Message from</th>
                <th scope="col">title</th>
                <th scope="col">content</th>
                <th scope="col">time</th>
            </tr>
            </thead>
            <tbody>
            <%
                int i = 0;

                for(Message msg : msgs){
                    out.write("<tr>");
                    out.write("<td>" + (++i) + "</td>");
                    out.write("<td>" + msg.getWho() + "</td>");
                    out.write("<td>" + msg.getTitle() + "</td>");
                    out.write("<td>" + msg.getContent() + "</td>");
                    out.write("<td>" + msg.getWhen() + "</td>");
                    out.write("</tr>");
                }
            %>
            </tbody>
        </table>
    </div>
</div>
</body>
</html>

LoginChecker.java(过滤器)

package filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Author: WQ
 * @Date: 2019/4/28 15:29
 * @Version
 */
public class LoginChecker implements Filter {

    //FilterConfig可用于访问filter的配置信息
    private FilterConfig config;
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException {
        //获取Filter的配置参数
        String encoding = config.getInitParameter("encoding");
        String loginPage = config.getInitParameter("loginPage");
        String loginServlet = config.getInitParameter("LoginServlet");
        HttpSession session = ((HttpServletRequest)request).getSession();
        //设置request编码用的字符集
        request.setCharacterEncoding(encoding);
        String requestPath = ((HttpServletRequest)request).getServletPath();//获取用户请求地址
        if(session.getAttribute("LOGIN_USER") == null
            && !requestPath.endsWith(loginPage)
            && !requestPath.endsWith(loginServlet)
            && !requestPath.endsWith("index")){
            request.getRequestDispatcher(loginPage).forward(request,response);
        }else{
            fc.doFilter(request,response);//放行
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {this.config = filterConfig;}
    @Override
    public void destroy() {this.config = null;}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值