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);
}
你这个是出现了空指针
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行的错
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
- 完 关于springmvc下载大的文件(2G)爆出 溢出 请求帮助
- 等 部署maven springmvc项目抛出异常java.lang.IllegalStateException: ApplicationEventMulticaster not initialized?
- 等 关于springmvc文件上传的问题
- 等 springmvc + mybatis-spring-1.2.2 启动报错
- 完 Springmvc用户注销退出登录功能疑问
- 等 springmvc怎样整合才能把事务放在控制层?求大神指教!!!
- 等 Springmvc开发中java bean对象自动初始化失败求解
- 等 maven springMVC调用数据库实现用户登录,列表显示代码
- 完 springmvc从3.1.4.RELEASE升级到4.1.1.RELEASE版本后,ajax请求返回json时为什么报错?
- 等 SpringMVC中上传文件MultipartFile对象调用Inputstream方法失败问题
- 完 spring MVC中使用国际化为什么是乱码?
- 等 spring MVC中的@service和@autowired有什么联系么?