叫我刘五环的gravatar头像
叫我刘五环 2015-12-10 18:31:56

spring MVC开发后台权限admin登录正常,其他权限登录为什么抛出异常?

我设置了三个权限,然而我只能admin权限登陆才可以,其他的权限登陆就下面的错误,这是什么回事,哪里错了吗?请大神们帮帮忙..谢谢啦
出错的提示:

重: Servlet.service() for servlet [springMVC] in context with path [/wsdc] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException
at java.util.AbstractCollection.addAll(AbstractCollection.java:341)
at org.lh.controller.LoginController.getAllActions(LoginController.java:78)
at org.lh.controller.LoginController.login(LoginController.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.lh.web.SystemContextFilter.doFilter(SystemContextFilter.java:37)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)

代码:
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(String username,String password,String checkcode,Model model,HttpSession session) {
String cc = (String)session.getAttribute("cc");
if(!cc.equals(checkcode)) {
model.addAttribute("error","验证码出错,请重新输入");
return "admin/login";
}
User loginUser = userService.login(username, password);
session.setAttribute("loginUser", loginUser);
List<Role> rs = userService.listUserRoles(loginUser.getId());
boolean isAdmin = isRole(rs,RoleType.ROLE_ADMIN);
session.setAttribute("isAdmin", isAdmin);
if(!isAdmin) {
session.setAttribute("allActions", getAllActions(rs, session));56行的错
}
session.removeAttribute("cc");
return "redirect:/admin";
}

@SuppressWarnings("unchecked")
private Set<String> getAllActions(List<Role> rs,HttpSession session) {
Set<String> actions = new HashSet<String>();
Map<String,Set<String>> allAuths = (Map<String,Set<String>>)session.getServletContext().getAttribute("allAuths");
actions.addAll(allAuths.get("base"));
for(Role r:rs) {
if(r.getRoleType()==RoleType.ROLE_ADMIN) continue;
actions.addAll(allAuths.get(r.getRoleType().name()));78行的错
}
return actions;
}

public class AuthUtil {
/**
 * 初始化系统的角色所访问的功能信息
 * @return
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public static Map<String,Set<String>> initAuth(String pname) {
try {
Map<String,Set<String>> auths = new HashMap<String, Set<String>>();
String[] ps = getClassByPackage(pname);
for(String p:ps) {
String pc = pname+"."+p.substring(0,p.lastIndexOf(".class"));
//得到了类的class对象
Class clz = Class.forName(pc);
if(!clz.isAnnotationPresent(AuthClass.class)) continue;
// System.out.println(pc);
//获取每个类中的方法,以此确定哪些角色可以访问哪些方法
Method[] ms = clz.getDeclaredMethods();
/*
 * 遍历method来判断每个method上面是否存在相应的AuthMethd
 * 如果存在就直接将这个方法存储到auths中,如果不存在就不存储
 * 不存储就意味着该方法只能由超级管理员访问
 */
for(Method m:ms) {
if(!m.isAnnotationPresent(AuthMethod.class)) continue;
//如果存在就要获取这个Annotation
AuthMethod am = m.getAnnotation(AuthMethod.class);
String roles = am.role();
//可能一个action可以被多个角色所访问,使用,进行分割
String[] aRoles = roles.split(",");
for(String role:aRoles) {
Set<String> actions = auths.get(role);
if(actions==null) {
actions = new HashSet<String>();
auths.put(role, actions);
}
actions.add(pc+"."+m.getName());
}
}
}
return auths;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
 * 根据包获取所有的类
 * @param pname
 * @return
 */
private static String[] getClassByPackage(String pname) {
String pr = pname.replace(".", "/");
String pp = AuthUtil.class.getClassLoader().getResource(pr).getPath();
File file = new File(pp);
String[] fs = file.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(name.endsWith(".class")) return true;
return false;
}
});
return fs;
}

public static void main(String[] args) {
System.out.println(initAuth("org.lh.controller"));
}
}

@Retention(RetentionPolicy.RUNTIME)
public @interface AuthClass {
/**
 * 如果value为admin就表示这个类只能超级管理员访问
 * 如果value为login表示这个类中的方法,某些可能为相应的角色可以访问
 * @return
 */
public String value() default "admin";
}


/**
 * 用来确定哪些方法由哪些角色访问
 * 属性有一个role:如果role的值为base表示这个方法可以被所有的登录用户访问
 * 如果为ROLE_PUBLISH表示只能为文章发布人员访问
 * 如果某个方法中没有加入AuthMethod就表示该方法只能被管理员所访问
 * @author Administrator
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthMethod {
public String role() default "base";
}


public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static WebApplicationContext wc;
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//初始化spring的工厂
wc = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
//初始化权限信息
Map<String,Set<String>> auths = AuthUtil.initAuth("org.lh.controller");
this.getServletContext().setAttribute("allAuths", auths);
System.out.println("------------------------系统初始化成功:"+auths+"-----------------------------");
}
public static WebApplicationContext getWc() {
return wc;
}
}
拦截器
public class AuthInterceptor extends HandlerInterceptorAdapter {
@SuppressWarnings("unchecked")
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
/*
 * 如果使用uploadify进行文件的上传,由于flash的bug问题,会产生一个新的session,此时验证失败
 * 所以必须在此处获取一个原有的session,然后重置session信息
 */
HandlerMethod hm = (HandlerMethod)handler;
User user = (User)session.getAttribute("loginUser");
if(user==null) {
response.sendRedirect(request.getContextPath()+"/login");
} else {
boolean isAdmin = (Boolean)session.getAttribute("isAdmin");
if(!isAdmin) {
//不是超级管理人员,就需要判断是否有权限访问某些功能
Set<String> actions = (Set<String>)session.getAttribute("allActions");
String aname = hm.getBean().getClass().getName()+"."+hm.getMethod().getName();
if(!actions.contains(aname)) throw new CmsException("没有权限访问该功能");
}
}
return super.preHandle(request, response, handler);
}
 

所有回答列表(2)
huangtian5的gravatar头像
huangtian5  LV3 2015年12月12日

你这个是出现了空指针

java.lang.NullPointerException
at java.util.AbstractCollection.addAll(AbstractCollection.java:341)

下面一个addAll中r.getRoleType()应该是返回的空值,你可以看看是r的角色类型没有?

actions.addAll(allAuths.get("base"));
for(Role r:rs) {
if(r.getRoleType()==RoleType.ROLE_ADMIN) continue;
actions.addAll(allAuths.get(r.getRoleType().name()));78行的错

渴望飞翔的小猪的gravatar头像
渴望飞翔的小猪  LV10 2015年12月14日

空指针异常,你看看controller是否接收到值

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友