pom. (对Kaptcha.jar的引用)

  <!-- 验证码 jar kaptcha-->
    <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>
    </dependencies>

spring-mvc. (Kaptche的相关设置)

<bean id=\"captchaProducer\" class=\"com.google.code.kaptcha.impl.DefaultKaptcha\">  
        <property name=\"config\">  
            <bean class=\"com.google.code.kaptcha.util.Config\">  
                <constructor-arg>  
                    <props> 
                        <!-- 是否有边框 可选yes 或者 no --> 
                        <prop key=\"kaptcha.border\">yes</prop>  
                        <!-- 边框颜色 -->
                        <prop key=\"kaptcha.border.color\">105,179,90</prop>  
                        <!-- 验证码文本字符颜色 -->
                        <prop key=\"kaptcha.textproducer.font.color\">blue</prop>  
                        <!-- 验证码文本字符大小 -->
                        <prop key=\"kaptcha.textproducer.font.size\">45</prop>  
                        <!-- 验证码图片的宽度 默认200 -->
                        <prop key=\"kaptcha.image.width\">125</prop>  
                        <!-- 验证码图片的高度 默认50 -->
                        <prop key=\"kaptcha.image.height\">45</prop>  
                        <!-- 验证码文本字符长度  默认为5 -->
                        <prop key=\"kaptcha.textproducer.char.length\">4</prop>  
                        <!-- 验证码文本字体样式  默认为new Font(\"Arial\", 1, fontSize), new Font(\"Courier\", 1, fontSize)  -->
                        <prop key=\"kaptcha.textproducer.font.names\">宋体,楷体,微软雅黑</prop>  
                    </props>  
                </constructor-arg>  
            </bean>  
        </property>  
    </bean>

Controller.java(验证码获取Controller)

@Controller
public class  Controller {

    @Autowired
    private Producer captchaProducer = null;

   @RequestMapping(value = \"verifyImage\")
  public void getVerifyImage(HttpServletRequest request,HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        response.setDateHeader(\"Expires\", 0);  
        response.setHeader(\"Cache-Control\", \"no-store, no-cache, must-revalidate\");  
        response.addHeader(\"Cache-Control\", \"post-check=0, pre-check=0\");  
        response.setHeader(\"Pragma\", \"no-cache\");  
        response.setContentType(\"image/jpeg\"); 
        
        //生成验证码文本
        String capText = captchaProducer.createText();  
        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
        System.out.println(\"生成验证码文本====\"+capText);
        //利用生成的字符串构建图片
        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();  
        ImageIO.write(bi, \"jpg\", out);  
        
        try {  
            out.flush();  
        } finally {  
            out.close();  
        }
    }
login.jsp(用户登录页面)
<tr>
  <td align=\"right\" class=\"wenzi\">验证码:</td>
  <td width=\"59\">
    <
input id=\"rand\" tabindex=\"3\" name=\"rand\" maxlength=\'4\' type=\"text\" value=\"\" class=\"shurukuang1\">
  </
td>   <td width=\"56\">
    <
img name=\"randImage\" id=\"randImage\" src=\"\" width=\"64\" height=\"20\" border=\"1\" align=\"top\" =\" :void(0);\">
  </
td>   <td width=\"88\">&nbsp;</td> </tr>

前台js(初始化验证码图片)


<  type=\"text/ \">
    $(function() {
        $(\"#randImage\").attr(\"src\",\"${prc }/verifyImage.do?\"+Math.random());
    });
</ >

当写完前台代码,访问login.jsp时验证码获取失败(Status Code:302 Found)

\"\"

 

\"\"

 

\"\"

 

网上搜索Java 302 Found的资料及Navigated to的意思

结果:

302 Found 
请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
只有在Cache
-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。 新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。 如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。 注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,
   而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应
--------------------- 作者:5207 来源:CSDN 原文:https://blog.csdn.net/5207/article/details/52668300 版权声明:本文为博主原创文章,转载请附上博文链接!
Navigated to是什么意思?
Chrome console shows Navigate to url(地址)
告知地址跳转的问题,如果取消勾选 Preserverlog,这个消息一般不出现~

原文:https://zhidao.baidu.com/question/2012131565043479068.html

作为小白,查询到这些也是似懂非懂,无从下手修改程序.只能继续查询资料,功夫不负有心人.突然看到一篇文章给了我很大的启发:

Shiro眼皮下玩ajax,玩出302 Found

 解决方式:配置忽略项。在spring管理Shiro安全框架的配置文件中配置获取验证码的方法,让它可以匿名访问即可,就是用户没有登录,也可以发送请求到后台执行方法。
       <!-- shiro连接约束配置 -->
       <property name=\"filterChainDefinitions\">
            <value>
                <!-- 对静态资源设置允许匿名访问 -->
                /images/** = anon
                /js/** = anon
                /css/** = anon
                <!-- 可匿名访问路径,例如:短信验证码、登录连接、退出连接等 -->
                /auth/login = anon
                /user/sendCode = anon            
                <!-- 剩余其他路径,必须认证通过才可以访问 -->
                /** = authc
            </value>
        </property> 

来源:博客园 
原文:https://blog.csdn.net/5207/article/details/52668300

虽然不懂shiro是什么技术,但是文章中的一些字眼提醒了我,获取验证码的请求可能被程序拦截并被重定向到/tologin.do

这是突然想起自己已经在程序中设置LoginInterceptors(拦截器),就想请求可能被这个拦截器拦截.

解决办法:

spring-mvc. (LoginInterceptors对verifyImage.do放行

<!-- 注册登录拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path=\"/*/*.do\"/>
        <mvc:mapping path=\"/*.do\"/>
        <mvc:exclude-mapping path=\"/login.do\"/>
        <mvc:exclude-mapping path=\"/tologin.do\"/>
        <!-- 对验证码获取请求放行 -->
        <mvc:exclude-mapping path=\"/verifyImage.do\"/>
        <bean class=\"com.ahiki.epay.interceptors.LoginInterceptors\" />
    </mvc:interceptor>
</mvc:interceptors>

修改完成后访问登录页面,验证码获取成功!

\"\"

\"\"

 

 

 

到此,302 Found 问题解决!

******************************************************

*不忘初心,方得始终;初心易得,始终难守。 *

******************************************************

收藏 打印