zoukankan      html  css  js  c++  java
  • 009-shiro与spring web项目整合【三】验证码、记住我

    一、验证码

    1、自定义FormAuthenticationFilter

    需要在验证账号和名称之前校验验证码

    /**
     * 
     * <p>Title: CustomFormAuthenticationFilter</p>
     * <p>Description:自定义FormAuthenticationFilter,认证之前实现 验证码校验 </p>
     * @version 1.0
     */
    public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {
    
        //原FormAuthenticationFilter的认证方法
        @Override
        protected boolean onAccessDenied(ServletRequest request,
                ServletResponse response) throws Exception {
            //在这里进行验证码的校验
            //从session获取正确验证码
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpSession session =httpServletRequest.getSession();
            //取出session的验证码(正确的验证码)
            String validateCode = (String) session.getAttribute("validateCode");
            
            //取出页面的验证码
            //输入的验证和session中的验证进行对比 
            String randomcode = httpServletRequest.getParameter("randomcode");
            if(randomcode!=null && validateCode!=null && !randomcode.equals(validateCode)){
                //如果校验失败,将验证码错误失败信息,通过shiroLoginFailure设置到request中
                httpServletRequest.setAttribute("shiroLoginFailure", "randomCodeError");
                //拒绝访问,不再校验账号和密码 
                return true; 
            }
            return super.onAccessDenied(request, response);
        }
    }
    View Code

    2、FormAuthenticationFilter配置

    修改applicationContext-shiro.xml中对FormAuthenticationFilter的配置

    a、在shiroFilter中添加filters:

            <!-- 自定义filter配置 -->
            <property name="filters">
                <map>
                    <!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 -->
                    <entry key="authc" value-ref="formAuthenticationFilter"/>
                </map>
            </property>

    b、formAuthenticationFilter定义

        <!-- 自定义form认证过虑器 -->
        <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
        <bean id="formAuthenticationFilter" class="com.lhx.ssm.shiro.CustomFormAuthenticationFilter">
            <!-- 表单中账号的input名称 -->
            <property name="usernameParam" value="username"/>
            <!-- 表单中密码的input名称 -->
            <property name="passwordParam" value="password"/>
        </bean>

    3、登录页面

    添加验证码:

    <TR>
                                <TD>验证码:</TD>
                                <TD><input id="randomcode" name="randomcode" size="8" /> <img
                                    id="randomcode_img" src="${baseurl}validatecode.jsp" alt=""
                                    width="56" height="20" align='absMiddle' /> <a
                                    href=javascript:randomcode_refresh()>刷新</a></TD>
                            </TR>

    4、配置validatecode.jsp匿名访问

    修改applicationContext-shiro.xml:

                    <!-- 验证码,可匿名访问 -->
                    /validatecode.jsp = anon
    View Code

    二、记住我

    用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆。

    1、用户身份实现java.io.Serializable接口

    向cookie记录身份信息需要用户身份信息对象实现序列化接口,如下:

    /**
     * 用户身份信息,存入session 由于tomcat将session会序列化在本地硬盘上,所以使用Serializable接口
     */
    public class ActiveUser implements java.io.Serializable {

    2、配置rememberMeManager

    修改applicationContext-shiro.xml:

    安全管理器

        <!-- securityManager安全管理器 -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="realm" ref="customRealm"/>
            <!-- 注入session管理器 -->
            <property name="sessionManager" ref="sessionManager"/>
            <!-- 记住我 -->
            <property name="rememberMeManager" ref="rememberMeManager"/>
        </bean>
    View Code

    rememberMeManager管理器和cookie

        <!-- rememberMeManager管理器,写cookie,取出cookie生成用户信息 -->
        <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
            <property name="cookie" ref="rememberMeCookie"/>
        </bean>
        <!-- 记住我cookie -->
        <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
            <!-- rememberMe是cookie的名字 -->
            <constructor-arg value="rememberMe"/>
            <!-- 记住我cookie生效时间30天 -->
            <property name="maxAge" value="2592000"/>
        </bean>
    View Code

    3、FormAuthenticationFilter配置

    修改formAuthenticationFitler添加页面中“记住我checkbox”的input名称:

        <!-- 自定义form认证过虑器 -->
        <!-- 基于Form表单的身份验证过滤器,不配置将也会注册此过虑器,表单中的用户账号、密码及loginurl将采用默认值,建议配置 -->
        <bean id="formAuthenticationFilter" class="com.lhx.ssm.shiro.CustomFormAuthenticationFilter">
            <!-- 表单中账号的input名称 -->
            <property name="usernameParam" value="username"/>
            <!-- 表单中密码的input名称 -->
            <property name="passwordParam" value="password"/>
            <!-- 记住我input的名称 -->
            <property name="rememberMeParam" value="rememberMe"/>
        </bean>

    4、登录页面

    在login.jsp中添加“记住我”checkbox

    <TR>
      <TD></TD>
      <TD><input type="checkbox" name="rememberMe" />自动登陆</TD>
    </TR>
  • 相关阅读:
    实现tip浮层
    c++实现冒泡排序
    一天一小段js代码(no.4)
    html5 css3实现图中结构
    html表格相关
    js跨浏览器的事件处理函数
    js实现DOM结构
    CSS3实现鼠标移动到图片上图片变大(缓慢变大,有过渡效果,放大的过程是有动画过渡的,这个过渡的时间可以自定义)
    正则表达式学习笔记
    使用JS与CSS3的翻转实现3D翻牌效果
  • 原文地址:https://www.cnblogs.com/bjlhx/p/7420807.html
Copyright © 2011-2022 走看看