{"id":2543,"date":"2022-12-13T17:02:54","date_gmt":"2022-12-13T09:02:54","guid":{"rendered":"https:\/\/qaqaq.top\/?p=2543"},"modified":"2022-12-13T17:02:54","modified_gmt":"2022-12-13T09:02:54","slug":"kaptcha%e9%aa%8c%e8%af%81%e7%a0%81%e4%b8%8b%e8%bd%bd","status":"publish","type":"post","link":"https:\/\/qaqaq.top\/?p=2543","title":{"rendered":"kaptcha\u9a8c\u8bc1\u7801\u4e0b\u8f7d"},"content":{"rendered":"\n<p>\u4e0b\u8f7d\u5730\u5740<\/p>\n\n\n\n<p><a href=\"https:\/\/code.google.com\/archive\/p\/kaptcha\/downloads\">Google Code Archive &#8211; Long-term storage for Google Code Project Hosting.<\/a><\/p>\n\n\n\n<p>\u6ce8\u610f \u5982\u679c\u662ftomcat10 \u5305\u540d\u4e3ajakarta.servlet.Servlet<\/p>\n\n\n\n<p>\u65b0\u5efa\u4e00\u4e2aservlet\uff0c\u8c03\u7528\u5efa\u7684servlet\u5373\u53ef<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package top.qaqaq.web;\r\n\r\nimport com.google.code.kaptcha.Producer;\r\nimport com.google.code.kaptcha.util.Config;\r\nimport jakarta.servlet.Servlet;\r\nimport jakarta.servlet.ServletConfig;\r\nimport jakarta.servlet.ServletException;\r\nimport jakarta.servlet.ServletOutputStream;\r\nimport jakarta.servlet.http.HttpServlet;\r\nimport jakarta.servlet.http.HttpServletRequest;\r\nimport jakarta.servlet.http.HttpServletResponse;\r\n\r\nimport javax.imageio.ImageIO;\r\nimport java.awt.image.BufferedImage;\r\nimport java.io.IOException;\r\nimport java.util.Date;\r\nimport java.util.Enumeration;\r\nimport java.util.Properties;\r\n\r\n\/**\r\n * @author RichieZhang\r\n * @create 2022-12-13 \u4e0b\u5348 3:21\r\n *\/\r\npublic class MyKaptchaServlet extends HttpServlet implements Servlet {\r\n    private Properties props = new Properties();\r\n    private Producer kaptchaProducer = null;\r\n    private String sessionKeyValue = null;\r\n    private String sessionKeyDateValue = null;\r\n\r\n    public MyKaptchaServlet() {\r\n    }\r\n\r\n    public void init(ServletConfig conf) throws ServletException {\r\n        super.init(conf);\r\n        ImageIO.setUseCache(false);\r\n        Enumeration initParams = conf.getInitParameterNames();\r\n\r\n        while (initParams.hasMoreElements()) {\r\n            String key = (String) initParams.nextElement();\r\n            String value = conf.getInitParameter(key);\r\n            this.props.put(key, value);\r\n        }\r\n\r\n        Config config = new Config(this.props);\r\n        this.kaptchaProducer = config.getProducerImpl();\r\n        this.sessionKeyValue = config.getSessionKey();\r\n        this.sessionKeyDateValue = config.getSessionDate();\r\n    }\r\n\r\n    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\r\n        resp.setDateHeader(\"Expires\", 0L);\r\n        resp.setHeader(\"Cache-Control\", \"no-store, no-cache, must-revalidate\");\r\n        resp.addHeader(\"Cache-Control\", \"post-check=0, pre-check=0\");\r\n        resp.setHeader(\"Pragma\", \"no-cache\");\r\n        resp.setContentType(\"image\/jpeg\");\r\n        String capText = this.kaptchaProducer.createText();\r\n        req.getSession().setAttribute(this.sessionKeyValue, capText);\r\n        req.getSession().setAttribute(this.sessionKeyDateValue, new Date());\r\n        BufferedImage bi = this.kaptchaProducer.createImage(capText);\r\n        ServletOutputStream out = resp.getOutputStream();\r\n        ImageIO.write(bi, \"jpg\", out);\r\n    }\r\n}\r\n<\/code><\/pre>\n\n\n\n<p>web.xml<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    &lt;servlet>\r\n        &lt;servlet-name>KaptchaServlet&lt;\/servlet-name>\r\n        &lt;servlet-class>top.qaqaq.web.MyKaptchaServlet&lt;\/servlet-class>\r\n    &lt;\/servlet>\r\n    &lt;servlet-mapping>\r\n        &lt;servlet-name>KaptchaServlet&lt;\/servlet-name>\r\n        &lt;url-pattern>\/kaptcha.jpg&lt;\/url-pattern>\r\n    &lt;\/servlet-mapping><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0b\u8f7d\u5730\u5740 Google Code Archive &#8211; Long-term storage for  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89],"tags":[61],"class_list":["post-2543","post","type-post","status-publish","format-standard","hentry","category-javaweb-","tag-javaweb"],"_links":{"self":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/2543"}],"collection":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2543"}],"version-history":[{"count":1,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/2543\/revisions"}],"predecessor-version":[{"id":2544,"href":"https:\/\/qaqaq.top\/index.php?rest_route=\/wp\/v2\/posts\/2543\/revisions\/2544"}],"wp:attachment":[{"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qaqaq.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}