第十六章 综合实例——《跟我学shiro》 -凯发k8国际

`
jinnianshilongnian
  • 浏览: 21401402 次
  • 性别:
最近访客
博主相关
  • 微博
  • 相册
  • 收藏
  • 博客专栏
    跟我学spring3
    浏览量:2398690
    spring杂谈
    浏览量:2992538
    跟开涛学springmvc...
    浏览量:5627907
    servlet3.1规范翻...
    浏览量:256183
    springmvc杂谈
    浏览量:1591306
    hibernate杂谈
    浏览量:248335
    跟我学shiro
    浏览量:5842229

    浏览量:695959

    浏览量:778542
    文章分类
    社区版块
    • ( 10)
    • ( 1112)
    • ( 2428)
    存档分类
    最新评论
    • : 认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死 ...
    • : holyselina 写道您前面说到能获取调用是的参数数组,我 ...
    • : access denied for user 'root'@' ...
    • : 只有@aspectj支持命名切入点,而schema风格不支持命 ...
    • : 支持虽然会迟到,但永远不会缺席!

    第十六章 综合实例——《跟我学shiro》

      博客分类:

     

    目录贴:

     

    简单的实体关系图


     

    简单数据字典

    用户(sys_user)

    名称

    类型

    长度

    描述

    id

    bigint

     

    编号 主键

    username

    varchar

    100

    用户名

    password

    varchar

    100

    密码

    salt

    varchar

    50

    role_ids

    varchar

    100

    角色列表

    locked

    bool

     

    账户是否锁定

    组织机构(sys_organization)

    名称

    类型

    长度

    描述

    id

    bigint

     

    编号 主键

    name

    varchar

    100

    组织机构名

    priority

    int

     

    显示顺序

    parent_id

    bigint

     

    父编号

    parent_ids

    varchar

    100

    父编号列表

    available

    bool

     

    是否可用

    资源(sys_resource)

    名称

    类型

    长度

    描述

    id

    bigint

     

    编号 主键

    name

    varchar

    100

    资源名称

    type

    varchar

    50

    资源类型,

    priority

    int

     

    显示顺序

    parent_id

    bigint

     

    父编号

    parent_ids

    varchar

    100

    父编号列表

    permission

    varchar

    100

    权限字符串

    available

    bool

     

    是否可用

    角色(sys_role)

    名称

    类型

    长度

    描述

    id

    bigint

     

    编号 主键

    role

    varchar

    100

    角色名称

    description

    varchar

    100

    角色描述

    resource_ids

    varchar

    100

    授权的资源

    available

    bool

     

    是否可用

     

    资源:表示菜单元素、页面按钮元素等;菜单元素用来显示界面菜单的,页面按钮是每个页面可进行的操作,如新增、修改、删除按钮;使用type来区分元素类型(如menu表示菜单,button代表按钮),priority是元素的排序,如菜单显示顺序;permission表示权限;如用户菜单使用user:*;也就是把菜单授权给用户后,用户就拥有了user:*权限;如用户新增按钮使用user:create,也就是把用户新增按钮授权给用户后,用户就拥有了user:create权限了;available表示资源是否可用,如菜单显示/不显示。

    角色role表示角色标识符,如admin,用于后台判断使用;description表示角色描述,如超级管理员,用于前端显示给用户使用;resource_ids表示该角色拥有的资源列表,即该角色拥有的权限列表(显示角色),即角色是权限字符串集合;available表示角色是否可用。

    组织机构name表示组织机构名称,priority是组织机构的排序,即显示顺序;available表示组织机构是否可用。

    用户username表示用户名;password表示密码;salt表示加密密码的盐;role_ids表示用户拥有的角色列表,可以通过角色再获取其权限字符串列表;locked表示用户是否锁定。

     

    此处如资源、组织机构都是树型结构:

    id

    name

    parent_id

    parent_ids

    1

    总公司

    0

    0/

    2

    山东分公司

    1

    0/1/

    3

    河北分公司

    1

    0/1/

    4

    济南分公司

    2

    0/1/2/

    parent_id表示父编号,parent_ids表示所有祖先编号;如0/1/2/表示其祖先是210;其中根节点父编号为0

     

    为了简单性,如用户-角色,角色-资源关系直接在实体(用户表中的role_ids,角色表中的resource_ids)里完成的,没有建立多余的关系表,如要查询拥有admin角色的用户时,建议建立关联表,否则就没必要建立了。在存储关系时如role_ids=1,2,3,;多个之间使用逗号分隔。

     

    用户组、组织机构组本实例没有实现,即可以把一组权限授权给这些组,组中的用户/组织机构就自动拥有这些角色/权限了;另外对于用户组可以实现一个默认用户组,如论坛,不管匿名/登录用户都有查看帖子的权限。

     

    更复杂的权限请参考我的《javaee项目开发脚手架》:

     

    /数据sql

    具体请参考

    sql/ shiro-schema.sql (表结构)

    sql/ shiro-data.sql  (初始数据)

     

    默认用户名/密码是admin/123456

     

    实体

    具体请参考com.github.zhangkaitao.shiro.chapter16.entity包下的实体,此处就不列举了。

     

    dao

    具体请参考com.github.zhangkaitao.shiro.chapter16.dao包下的dao接口及实现。

     

    service

    具体请参考com.github.zhangkaitao.shiro.chapter16.service包下的service接口及实现。以下是出了基本crud之外的关键接口:

    public interface resourceservice {
        set findpermissions(set resourceids); //得到资源对应的权限字符串
        list findmenus(set permissions); //根据用户权限得到菜单
    }
    
    public interface roleservice {
        set findroles(long... roleids); //根据角色编号得到角色标识符列表
        set findpermissions(long[] roleids); //根据角色编号得到权限字符串列表
    }
    
    public interface userservice {
        public void changepassword(long userid, string newpassword); //修改密码
        public user findbyusername(string username); //根据用户名查找用户
        public set findroles(string username);// 根据用户名查找其角色
        public set findpermissions(string username);// 根据用户名查找其权限
    } 

    service实现请参考源代码,此处就不列举了。

     

    userrealm实现     

    public class userrealm extends authorizingrealm {
        @autowired private userservice userservice;
        protected authorizationinfo dogetauthorizationinfo(principalcollection principals) {
            string username = (string)principals.getprimaryprincipal();
            simpleauthorizationinfo authorizationinfo = new simpleauthorizationinfo();
            authorizationinfo.setroles(userservice.findroles(username));
            authorizationinfo.setstringpermissions(userservice.findpermissions(username));
            system.out.println(userservice.findpermissions(username));
            return authorizationinfo;
        }
        protected authenticationinfo dogetauthenticationinfo(authenticationtoken token) throws authenticationexception {
            string username = (string)token.getprincipal();
            user user = userservice.findbyusername(username);
            if(user == null) {
                throw new unknownaccountexception();//没找到帐号
            }
            if(boolean.true.equals(user.getlocked())) {
                throw new lockedaccountexception(); //帐号锁定
            }
            return new simpleauthenticationinfo(
                    user.getusername(), //用户名
                    user.getpassword(), //密码
                    bytesource.util.bytes(user.getcredentialssalt()),//salt=username salt
                    getname()  //realm name
            );
        }
    }

    此处的userrealm和《第六章realm及相关对象》中的userrealm类似,通过userservice获取帐号及角色/权限信息。

     

    web层控制器 

    @controller
    public class indexcontroller {
        @autowired
        private resourceservice resourceservice;
        @autowired
        private userservice userservice;
        @requestmapping("/")
        public string index(@currentuser user loginuser, model model) {
            set permissions = userservice.findpermissions(loginuser.getusername());
            list menus = resourceservice.findmenus(permissions);
            model.addattribute("menus", menus);
            return "index";
        }
    } 

    indexcontroller中查询菜单在前台界面显示,请参考相应的jsp页面;

       

    @controller
    public class logincontroller {
        @requestmapping(value = "/login")
        public string showloginform(httpservletrequest req, model model) {
            string exceptionclassname = (string)req.getattribute("shirologinfailure");
            string error = null;
            if(unknownaccountexception.class.getname().equals(exceptionclassname)) {
                error = "用户名/密码错误";
            } else if(incorrectcredentialsexception.class.getname().equals(exceptionclassname)) {
                error = "用户名/密码错误";
            } else if(exceptionclassname != null) {
                error = "其他错误:"   exceptionclassname;
            }
            model.addattribute("error", error);
            return "login";
        }
    } 

    logincontroller用于显示登录表单页面,其中shiro authc拦截器进行登录,登录失败的话会把错误存到shirologinfailure属性中,在该控制器中获取后来显示相应的错误信息。 

     

    @requirespermissions("resource:view")
    @requestmapping(method = requestmethod.get)
    public string list(model model) {
        model.addattribute("resourcelist", resourceservice.findall());
        return "resource/list";
    } 

    在控制器方法上使用@requirespermissions指定需要的权限信息,其他的都是类似的,请参考源码。

     

    web层标签库

    com.github.zhangkaitao.shiro.chapter16.web.taglib.functions提供了函数标签实现,有根据编号显示资源/角色/组织机构名称,其定义放在src/main/webapp/tld/zhang-functions.tld

     

    web层异常处理器 

    @controlleradvice
    public class defaultexceptionhandler {
        @exceptionhandler({unauthorizedexception.class})
        @responsestatus(httpstatus.unauthorized)
        public modelandview processunauthenticatedexception(nativewebrequest request, unauthorizedexception e) {
            modelandview mv = new modelandview();
            mv.addobject("exception", e);
            mv.setviewname("unauthorized");
            return mv;
        }
    } 

    如果抛出unauthorizedexception,将被该异常处理器截获来显示没有权限信息。

     

    spring配置——spring-config.xml

    定义了context:component-scan来扫描除web层的组件、datasource(数据源)、事务管理器及事务切面等;具体请参考配置源码。

     

    spring配置——spring-config-cache.xml

    定义了spring通用cache,使用ehcache实现;具体请参考配置源码。

     

    spring配置——spring-config-shiro.xml

    定义了shiro相关组件。 

    
        
        
     

    userrealm组件禁用掉了cache,可以参考实现自己的cache切面;否则需要在修改如资源/角色等信息时清理掉缓存。 

     

     

    sysuserfilter用于根据当前登录用户身份获取user信息放入request;然后就可以通过request获取user。 

      

    
      
        /login = authc
        /logout = logout
        /authenticated = authc
        /** = user,sysuser
      
     

    如上是shirofilterfilterchaindefinitions定义。 

     

    spring mvc配置——spring-mvc.xml

    定义了spring mvc相关组件。 

    
      
        
      
     

    此处注册了一个@currentuser参数解析器。如之前的indexcontroller,从request获取shiro sysuser拦截器放入的当前登录user对象。

     

     

    spring mvc配置——spring-mvc-shiro.xml

    定义了spring mvc相关组件。 

    
    
      
     

    定义aop切面,用于代理如@requirespermissions注解的控制器,进行权限控制。

     

    web.xml配置文件

    定义spring root上下文加载器、shirofilter、及springmvc拦截器。具体请参考源码。

     

    jsp页面       

    
        
     

    使用shiro标签进行权限控制。具体请参考源码。

     

    系统截图

    访问

    首先进入登录页面,输入用户名/密码(默认admin/123456)登录: 

    登录成功后到达整个页面凯发k8国际娱乐官网入口主页,并根据当前用户权限显示相应的菜单,此处菜单比较简单,没有树型结构显示   


    然后就可以进行一些操作,如组织机构维护、用户修改、资源维护、角色授权 







     

     

    相关资料

    《跟我学spring3

         http://www.iteye.com/blogs/subjects/spring3

    《跟开涛学springmvc

         http://www.iteye.com/blogs/subjects/kaitao-springmvc

    《简单shiro扩展实现notandor权限验证》

        

    shiro struts2 spring3 加上@requirespermissions @autowired失效》

        

     

    更复杂的权限请参考我的《javaee项目开发脚手架》:,提供了更加复杂的实现。

     

     

     

    示例源代码:;可加群 231889722 探讨spring/shiro技术。

            

      

    请你欣赏春天美景 

         

    • 大小: 8.2 kb
    • 大小: 2.3 kb
    • 大小: 7.4 kb
    • 大小: 5.7 kb
    • 大小: 5.7 kb
    • 大小: 5.1 kb
    • 大小: 17.8 kb
    • 大小: 9.9 kb
    30
    15
    分享到:
    |
    评论
    46 楼 2019-08-19  
    认真看错误代码,有时候重启电脑就行了 醉了 我把数据库配置写死不用配置文件 改 userserviceimpl passwordhelper 去掉 @value("${password.ha***erations}") 就行了
    45 楼 2019-08-16  
    access denied for user 'root'@'localhost' (using password: no) 这教程我看的真的很痛苦 源码倒进去的 配置文件也添加了密码 自己的问题   
    44 楼 2017-12-25  
    erlie 写道
    大佬,登陆页面有一个bug,登陆成功再返回登陆页面,再次点击登陆没有反应

    出现的原因是如果不设置登陆成功的地址,会自动跳转到上一个路径,这样就造成了死循环
    43 楼 2017-12-25  
    大佬,登陆页面有一个bug,登陆成功再返回登陆页面,再次点击登陆没有反应
    42 楼 2017-06-28  
    java.lang.classcastexception: org.springframework.cache.support.simplevaluewrapper cannot be cast to org.apache.shiro.session.session
    org.apache.shiro.session.mgt.eis.cachingsessiondao.getcachedsession(cachingsessiondao.java:217)
    org.apache.shiro.session.mgt.eis.cachingsessiondao.getcachedsession(cachingsessiondao.java:202)
    org.apache.shiro.session.mgt.eis.cachingsessiondao.readsession(cachingsessiondao.java:259)
    org.apache.shiro.session.mgt.defaultsessionmanager.retrievesessionfromdatasource(defaultsessionmanager.java:236)
    org.apache.shiro.session.mgt.defaultsessionmanager.retrievesession(defaultsessionmanager.java:222)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.dogetsession(abstractvalidatingsessionmanager.java:118)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.lookupsession(abstractnativesessionmanager.java:148)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.getsession(abstractnativesessionmanager.java:140)
    org.apache.shiro.mgt.sessionssecuritymanager.getsession(sessionssecuritymanager.java:156)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvecontextsession(defaultsecuritymanager.java:460)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvesession(defaultsecuritymanager.java:446)
    org.apache.shiro.mgt.defaultsecuritymanager.createsubject(defaultsecuritymanager.java:342)
    org.apache.shiro.subject.subject$builder.buildsubject(subject.java:845)
    org.apache.shiro.web.subject.websubject$builder.buildwebsubject(websubject.java:148)
    org.apache.shiro.web.servlet.abstractshirofilter.createsubject(abstractshirofilter.java:292)
    org.apache.shiro.web.servlet.abstractshirofilter.dofilterinternal(abstractshirofilter.java:359)
    org.apache.shiro.web.servlet.onceperrequestfilter.dofilter(onceperrequestfilter.java:125)
    org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:346)
    org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:262)
    org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:197)
    org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107)
    请问这个错误是怎么产生的呢?使用tomcat或jetty启动正常;访问地址localhost:8080/login就会产生这个错误,应该是defaultwebsecuritymanager中sessionmanager和cachemanager配置异常,但是不知道如何解决?还有一个问题,请问登录是在哪里执行的呢?
    41 楼 2017-06-16  
    这个问题有人遇到没,自定义标签,找了好久解决不了http status 500 - the absolute uri: http://github.com/zhangkaitao/tags/zhang-functions cannot be resolved in either web.xml or the jar files deployed with this application
    40 楼 2017-04-10  
    假如我明细下面还有列表,列表中还有按钮,这个权限字符串怎么排呢,请大神指教
    39 楼 2017-01-03  
    这个项目的访问默认地址,直接输入http://localhost:8087/chapter16 ,为什么就直接访问的是http://localhost:8087/chapter16/login;jsessionid=dde1f31c-46d9-4650-a1e3-e5988cf496db 这个是在哪配置的,求解答。
    38 楼 2016-08-04  
    github上的代码错误百出
    37 楼 2016-07-17  
    refels 写道
    tao哥,您的这个示例里的用户退出是怎么写的?在项目里没有找到

           
               
                    /login = authc
                    /logout = logout
    ........

    自动在logoutfilter中处理了
    36 楼 2016-06-01  
    string exceptionclassname = (string)req.getattribute("shirologinfailure") 得到的一直是org.apache.shiro.authc.authenticationexception,无法得到其子类
    35 楼 2016-05-11  
    tao哥,您的这个示例里的用户退出是怎么写的?在项目里没有找到
    34 楼 2016-04-20  
    您好!我运行http://localhost:8888/chapter16时,出现以下错误,不知道怎么回事,求解决  

    http status 500 - filtered request failed.

    type exception report

    message filtered request failed.

    description the server encountered an internal error that prevented it from fulfilling this request.

    exception

    javax.servlet.servletexception: filtered request failed.
    org.apache.shiro.web.servlet.abstractshirofilter.dofilterinternal(abstractshirofilter.java:384)
    org.apache.shiro.web.servlet.onceperrequestfilter.dofilter(onceperrequestfilter.java:125)
    org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:344)
    org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:261)
    org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:88)
    org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107)

    root cause

    java.lang.noclassdeffounderror: javax/transaction/usertransaction
    org.quartz.impl.stdschedulerfactory.instantiate(stdschedulerfactory.java:1104)
    org.quartz.impl.stdschedulerfactory.getscheduler(stdschedulerfactory.java:1355)
    org.quartz.impl.stdschedulerfactory.getdefaultscheduler(stdschedulerfactory.java:1371)
    org.apache.shiro.session.mgt.quartz.quartzsessionvalidationscheduler.getscheduler(quartzsessionvalidationscheduler.java:110)
    org.apache.shiro.session.mgt.quartz.quartzsessionvalidationscheduler.enablesessionvalidation(quartzsessionvalidationscheduler.java:164)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.enablesessionvalidation(abstractvalidatingsessionmanager.java:232)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.enablesessionvalidationifnecessary(abstractvalidatingsessionmanager.java:86)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.dogetsession(abstractvalidatingsessionmanager.java:114)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.lookupsession(abstractnativesessionmanager.java:108)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.getsession(abstractnativesessionmanager.java:100)
    org.apache.shiro.mgt.sessionssecuritymanager.getsession(sessionssecuritymanager.java:125)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvecontextsession(defaultsecuritymanager.java:456)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvesession(defaultsecuritymanager.java:442)
    org.apache.shiro.mgt.defaultsecuritymanager.createsubject(defaultsecuritymanager.java:338)
    org.apache.shiro.subject.subject$builder.buildsubject(subject.java:846)
    org.apache.shiro.web.subject.websubject$builder.buildwebsubject(websubject.java:148)
    org.apache.shiro.web.servlet.abstractshirofilter.createsubject(abstractshirofilter.java:292)
    org.apache.shiro.web.servlet.abstractshirofilter.dofilterinternal(abstractshirofilter.java:359)
    org.apache.shiro.web.servlet.onceperrequestfilter.dofilter(onceperrequestfilter.java:125)
    org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:344)
    org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:261)
    org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:88)
    org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107)

    root cause

    java.lang.classnotfoundexception: javax.transaction.usertransaction
    org.apache.catalina.loader.webappclassloader.loadclass(webappclassloader.java:1714)
    org.apache.catalina.loader.webappclassloader.loadclass(webappclassloader.java:1559)
    org.quartz.impl.stdschedulerfactory.instantiate(stdschedulerfactory.java:1104)
    org.quartz.impl.stdschedulerfactory.getscheduler(stdschedulerfactory.java:1355)
    org.quartz.impl.stdschedulerfactory.getdefaultscheduler(stdschedulerfactory.java:1371)
    org.apache.shiro.session.mgt.quartz.quartzsessionvalidationscheduler.getscheduler(quartzsessionvalidationscheduler.java:110)
    org.apache.shiro.session.mgt.quartz.quartzsessionvalidationscheduler.enablesessionvalidation(quartzsessionvalidationscheduler.java:164)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.enablesessionvalidation(abstractvalidatingsessionmanager.java:232)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.enablesessionvalidationifnecessary(abstractvalidatingsessionmanager.java:86)
    org.apache.shiro.session.mgt.abstractvalidatingsessionmanager.dogetsession(abstractvalidatingsessionmanager.java:114)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.lookupsession(abstractnativesessionmanager.java:108)
    org.apache.shiro.session.mgt.abstractnativesessionmanager.getsession(abstractnativesessionmanager.java:100)
    org.apache.shiro.mgt.sessionssecuritymanager.getsession(sessionssecuritymanager.java:125)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvecontextsession(defaultsecuritymanager.java:456)
    org.apache.shiro.mgt.defaultsecuritymanager.resolvesession(defaultsecuritymanager.java:442)
    org.apache.shiro.mgt.defaultsecuritymanager.createsubject(defaultsecuritymanager.java:338)
    org.apache.shiro.subject.subject$builder.buildsubject(subject.java:846)
    org.apache.shiro.web.subject.websubject$builder.buildwebsubject(websubject.java:148)
    org.apache.shiro.web.servlet.abstractshirofilter.createsubject(abstractshirofilter.java:292)
    org.apache.shiro.web.servlet.abstractshirofilter.dofilterinternal(abstractshirofilter.java:359)
    org.apache.shiro.web.servlet.onceperrequestfilter.dofilter(onceperrequestfilter.java:125)
    org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:344)
    org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:261)
    org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:88)
    org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107)

    note the full stack trace of the root cause is available in the apache tomcat/7.0.34 logs.
    apache tomcat/7.0.34
    33 楼 2015-12-30  
    newboy2004 写道
    java代码  收藏代码
     
       
         
     
     
      
    此处注册了一个@currentuser参数解析器。如之前的indexcontroller,从request获取shiro sysuser拦截器放入的当前登录user对象。


    没理解 能具体讲讲吗


    可以看看这个
    http://blog.csdn.net/truong/article/details/30971317
    32 楼 2015-12-28  
    andyadc 写道
    wtaisi 写道
    string exceptionclassname = (string)req.getattribute("shirologinfailure");tao哥。这个是从哪儿来的呢?我在整个项目都找了。找不到。从哪里req.setattribute()的呢???

    wtaisi 写道
    string exceptionclassname = (string)req.getattribute("shirologinfailure");tao哥。这个是从哪儿来的呢?我在整个项目都找了。找不到。从哪里req.setattribute()的呢???

    这个是shiro在认证错误抛到页面的,你只需要获取就好了



    在org.apache.shiro.web.filter.authc.formauthenticationfilter 里面
    31 楼 2015-12-14  
    stonefivezhang 写道
    sml_sunivo 写道
    sml_sunivo 写道
    您好!我运行http://localhost:8888/chapter16,到登录页面老是报错,不知道怎么回事,检查了半天找不到原因,求解决:
    java.lang.nullpointerexception
    at org.apache.jsp.web_002dinf.jsp.login_jsp._jspinit(login_jsp.java:25)


    解决了,多了个jsp-api.jar

    jsp-api 和web 容器冲突了我使用maven 编译运行在pom.xml 将对应的jar 属性设置成private 就行了



    在pom里吧jsp-api的依赖注释掉 clean install  tomcat:run或者jetty:run就可以访问了
    30 楼 2015-12-14  
    java代码  收藏代码
     
       
         
     
     
      
    此处注册了一个@currentuser参数解析器。如之前的indexcontroller,从request获取shiro sysuser拦截器放入的当前登录user对象。


    没理解 能具体讲讲吗
    29 楼 2015-08-24  
    你好1. 我已经登陆了,但是没有退出,新窗口中访问登陆页面会不会跳到登陆成功页面呢?2.我配置了登陆成功页面,登陆以后怎么还会跳到登陆钱访问的页面呢?
    28 楼 2015-08-19  
    wtaisi 写道
    string exceptionclassname = (string)req.getattribute("shirologinfailure");tao哥。这个是从哪儿来的呢?我在整个项目都找了。找不到。从哪里req.setattribute()的呢???

    wtaisi 写道
    string exceptionclassname = (string)req.getattribute("shirologinfailure");tao哥。这个是从哪儿来的呢?我在整个项目都找了。找不到。从哪里req.setattribute()的呢???

    这个是shiro在认证错误抛到页面的,你只需要获取就好了
    27 楼 2015-08-18  
    使用 的 jetty 启动的
    org.mortbay.jetty
    maven-jetty-plugin
    6.1.26



    8888



    相关推荐

      第十七章 oauth2集成——《跟我学shiro》 - 开涛的博客 - it...第1页 共13页本文把授权服务器和资源服务器整合在一起实现。依赖此处我们使用a

      跟我学shiro

      跟我学shiro学习资料。

      跟我学shiro跟我学shiro

      使用新版springboot改写跟我学shiro第16章源码。 springboot shiro jsp整合

      this compressed file is a detailed description of shiro

      ***txt文件中含有下载地址** 《跟我学shiro》- 张开涛,pdf版本,带目录,清晰。 示例源代码:https://github.com/zhangkaitao/shiro-example; 加qun 231889722 探讨spring/shiro技术。

      apache shiro是一个强大易用的java安全框架,...我找了一版 跟我学shiro教程pdf,里面讲的很详细.里面还附带了每个章节的源码.值得你收藏哟!饮水思源——原文出自:http://jinnianshilongnian.iteye.com/blog/2049092

      《跟我学shiro》pdf完结版下载, apache shiro是java的一个安全框架。目前,使用apache shiro的人越来越多,因为它相当简单,对比spring security,可能没有spring security做的功能强大,但是在实际工作时可能并不...

      张开涛

      跟我学shiro源码

      本资源包含: apache_shiro参考手册中文版.pdf; shiro教程.pdf; shrio-example.rar; 跟我学shiro教程.zip

      apache shiro 是 java 的一个安全框架。目前,使用 apache shiro 的人越来越多,因为它相当简单,对比 sp ring security,可能没有 spring security 做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所 ...

      shiro是一个java平台的开源权限框架,用于认证和访问授权

      跟我一起学shiro张开涛,含pdf及源码,入门shiro的最好书籍。

      apache shiro 是一个框架,可用于身份验证和授权,是一个简单易学的框架,跟我学shiro详细讲解了shiro的开发,这里是该书的全部源代码

      跟我学shiro第11章demo,本人亲自编写,完全可运行,运用了shiro提供的cache缓存和session缓存两大部分,大家慢慢品尝。。

    global site tag (gtag.js) - google analytics
    网站地图