我在使用 AppFuse_1.9.3_SpringMVC_IBatis 时发现了一些Bug,现在我把这些bug给出来,并提供个人的解决办法。不过,有的BUG我在处理时只记录了解决办法,却没有记录问题,不好意思……
Bug1: 不记得了……
解决办法:UserDaoiBatis.java文件中有句话
List userRoles = getSqlMapClientTemplate().queryForList("getUserRoles", user.getUsername());
其中的getUsername()应改为 getId()
或者直接去掉这句话,因为它没有任何作用
Bug2:在后台为某用户分配多个角色,结果该用户只获得了所选角色中的第一个
解决办法:在UserDaoiBatis.java文件中找到
if (userRoles.isEmpty()) {
getSqlMapClientTemplate().update("addUserRole", newRole);
}
然后去掉这个 if条件
Bug3:admin menu按权限显示时出莫名奇妙的问题
解决办法:将struts-menu版本升级到 2.4.3,并将cssHorizontalMenu.vm 和 cssVerticalMenu.vm替换为 appFuse2.0中的版本。
Bug4:不记得了……
解决办法:UserFormController中的
return new ModelAndView(new RedirectView("mainMenu.html"));
应改成 return new ModelAndView(new RedirectView("/mainMenu.html"));
同样,这个bean定义的 cancelView也要做相同的相改
Bug5: 出现org.acegisecurity.BadCredentialsException异常
解决办法:去掉UserSecurityAdvice中的两句话:
auth = new UsernamePasswordAuthenticationToken(user, user
.getPassword(), user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
因为这里的user.getPassword()拿到的是密文,但acegi要的是明文,结果导致BadCredentialsException异常。
那么去掉了这两句话,会不会对系统有什么影响?影响就是少掉了一个鸡肋的功能:若用户修改了自己的记录,则应更新自己的authentication。这个功能相当鸡肋,因为它只能应对 “用户修改自己资料”的情况,若用户修改了他人资料,它就不起作用。那么,有没有更好的替代方案?有的,就是 配置 filterInvocationInterceptor 的 alwaysReauthenticate属性为true。这样的话,不管修改了自己的资料还是他人的资料,都能保证authentication与User一致
Bug6: 修改了资源文件后仍然出现中文乱码
解决办法:对每个jsp,如果其中没有指定 pageEncoding,都要在jsp的最上方加上一行:<%@ page pageEncoding="UTF-8" %>,否则,tomcat不会把页面当作utf-8来编译,结果就是乱码
Bug7:UserCounterListener.attributeAdded()方法中出现java.lang.ClassCastException异常
解决办法:仿照 attributeRemoved()方法修改attributeAdded()方法
Bug8:修改用户角色后,该用户须重新登录才能更新权限
解决办法:在Spring配置文件中,把filterInvocationInterceptor 的 alwaysReauthenticate属性为true,以保证用户角色被更新后,它拥有的权限会在下一次操作时更新
Bug9:不记得了……
解决办法:将acegi的jar包从1.0.1换成了1.0.7
Bug10:某个功能的冗余设计
解决办法:应去掉adminInterceptor的bean定义,清扫该bean使用的场合,因为这个拦截跟 基于角色的控制机制 在功能上重复了。