IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 学习日志day39(2021-09-01)(1、关于页面乱码 2、异常的处理 3、使用Token机制处理表单重复提交 4、jcaptcha验证码 5、Commons Codec ) -> 正文阅读

[Java知识库]学习日志day39(2021-09-01)(1、关于页面乱码 2、异常的处理 3、使用Token机制处理表单重复提交 4、jcaptcha验证码 5、Commons Codec )

学习内容:学习JavaWeb(Day39)

1、关于页面乱码
2、异常的处理
3、使用Token机制处理表单重复提交
4、jcaptcha验证码
5、Commons Codec


1、关于页面乱码

(1)页面请求转发时出现乱码,可能是因为转发的页面是在当前地址下调用的,所以会继承转发之前页面的编码格式,可以试着修改转发之前的编码格式。
重定向出现乱码,可能是因为重定向后页面的编码格式被重新设置,默认为浏览器的编码格式导致乱码。

2、异常的处理

(1)当数据库出现问题时,
三个步骤:
1.将异常转换为非强制捕获型异常
2.将异常向上层抛出,并统一处理
3.在错误页面给出客户友好提示,并通知管理员处理异常信息

(2)自定义异常

public class DataAccessException extends RuntimeException{

    public DataAccessException(){}
    public DataAccessException(String msg){
        super(msg);
    }

    public DataAccessException(Throwable th){
        super(th);
    }

    public DataAccessException(Throwable th,String msg){
        super(msg,th);
    }
}

将异常转换为非强制捕获型异常,并向上抛出统一处理

try {
    conn = getConnection();
    stat = conn.prepareStatement(sql);
    for (int i = 0; i < params.length; i++) {
        stat.setObject(i + 1, params[i]);
    }
    rs = stat.executeQuery();
    while (rs.next()) {
        obj = rowMapper.mapperRow(rs);
    }
} catch (SQLException sqlException) {
	//1.将异常转换为非强制捕获型异常 
	//不再打印异常,调用自定义异常显示详细信息
	//sqlException.printStackTrace();
    throw new DataAccessException(sqlException,"服务器正在升级,请稍后再试");
    //2.将异常向上层抛出,并统一处理
}

设计出错页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>服务器正在升级中,请稍后重试!</h1>
</body>
</html>

在web.xml文件中配置出错跳转位置

<!-- 根据error-code跳转 -->
<error-page>
  <error-code>500</error-code>
  <location>/ErrorMsg.jsp</location>
</error-page>

<!-- 根据exception-type跳转 -->
<error-page>
  <exception-type>com.hisoft.news.exception.DataAccessException</exception-type>
  <location>/ErrorMsg.jsp</location>
</error-page>

设计错误页

<%-- isErrorPage="true"代表这是一个错误页 --%>
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Throwable th = null;
       /* if (exception != null) { //exception是个内置对象,代表当前异常
            th = exception;
        }*/
        if (request.getAttribute("javax.servlet.error.exception") != null) { 
        <!--获取当前异常 javax.servlet.error.exception是一个key-->
            th = (Throwable) request.getAttribute("javax.servlet.error.exception");
        }
        if (th != null) {
            // 输出当前请求的URI
            out.println(request.getAttribute("javax.servlet.error.request_uri"));
            // 输出导致错误页面被调用的Servlet的名字
            out.println(request.getAttribute("javax.servlet.error.servlet_name"));
            out.print(th); // 输出异常名称和异常信息
            out.print(th.getMessage()); // 输出异常信息
        }
    %>
</body>
</html>

request作用域中的key还有:
? javax.servlet.error.status_code: Integer HTTP协议的状态代码
? javax.servlet.error.exception_type: Class 未捕获异常的Class类的对象
? javax.servlet.error.message: String 传递给sendError()方法的消息
? javax.servlet.error.exception: Throwable 调用错误页面的未捕获异常
? javax.servlet.error.request_uri: String 当前请求的URI
? javax.servlet.error.servlet_name: String 导致错误页面被调用的Servlet的名字

3、使用Token机制处理表单重复提交

(1)在表单页面,提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。这是因为Servlet处理完请求以后,直接转发到目标页面,这样整个业务只发送了一次请求,那么当你在浏览器中点击刷新会一直都会刷新之前的请求。
这种情况可以使用重定向的方式跳转到目标页面,也可以使用token机制来处理。

(2)token机制:接收请求时,servlet生成一个唯一标识token,并放入session和request中,在表单中接收token,提交表单后验证表单的token和session的token是否相同,如果相同则说明是第一次提交,然后删除session中的token,如果第二次提交表单则会出现session不同,说明是重复提交。

@WebServlet("/form")
public class FormServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String token = UUID.randomUUID().toString();//生成token

	//存入request和session
        HttpSession session = req.getSession();
        session.setAttribute("token", token);
        req.setAttribute("token", token);
        
        req.getRequestDispatcher("form.jsp").forward(req, resp);//转发给表单页面
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String money = req.getParameter("money");
        String token = req.getParameter("token");//获取表单token

        HttpSession session = req.getSession();
        String sessionToken = (String) session.getAttribute("token");
        if (token.equals(sessionToken)) {//比较表单token和session的token
            System.out.println(money);
            session.removeAttribute("token");//删除session的token
            req.setAttribute("money", money);
            req.getRequestDispatcher("succ.jsp").forward(req, resp);//相同转发到成功页面
        } else {
            resp.sendRedirect("msg.jsp");//不相同重定向到提示页面
        }

    }
}

表单接收token

<form action="/form" method="post">
    <input type="hidden" value = "${requestScope.token}" name = "token">
    请输入支付金额:<input type="text" name = "money"><br>
    <input type="submit" value="支付">
</form>

成功页面

<body>
    <h3>支付成功!支付总金额:${money}</h3>
</body>

提示页面

<body>
    <h3>您已支付成功,请勿重复支付!!</h3>
</body>

4、jcaptcha验证码

(1)在官网下载jcaptcha包
https://jcaptcha.atlassian.net/wiki/display/general/Simple+Servlet+Integration+documentation

配置web.xml文件

<servlet>
    <servlet-name>jcaptcha</servlet-name>
    <servlet-class>com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>jcaptcha</servlet-name>
    <url-pattern>/jcaptcha.jpg</url-pattern>
</servlet-mapping>

表单中输入验证码内容,显示验证码图片

<form action="/form" method="post">
    <input type="text" name="jcaptcha" id = "">
    <img src="jcaptcha.jpg" /><a href="javaScript:void(0)" id = "btn">看不清换一张</a>
    <input type="submit" value="支付">
</form>

验证

String userCaptchaResponse = request.getParameter("jcaptcha"); 
boolean captchaPassed = SimpleImageCaptchaServlet.validateRespons (request,userCaptchaResponse); 
if(captchaPassed){ 
    // proceed to submit action 
}else{ 
    // return error to user 
}

5、Commons Codec

(1)commons-codec是Apache开源组织提供的用于摘要运算、编码解码的包。常见的编码解码工具Base64、MD5、Hex、SHA1、DES等。

//MD5加密 
String md5 = DigestUtils.md5Hex("000000"); 
System.out.println(md5); 
//SHA-1加密 
String sha1 = DigestUtils.shaHex("000000"); 
System.out.println(sha1);

(2)JavaScript加密库:前端的数据提交到后台之前对重要数据进行加密

 <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/sha1.js"></script> 
 <script>
     var hash = CryptoJS.SHA1("Message"); 
 </script> 
 <script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/md5.js"></script> 
 <script>
     var hash = CryptoJS.MD5("Message"); 
 </script>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:13:10  更:2021-09-02 11:14:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:22:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码