关于shiro权限控制异常的抓取及跳转问题:如果用户登录没有所需的角色role或者所需的权限permission这时候应该抓取异常并跳转到异常提示页面一般我知道的三种处理方式。
1、直接在配置文件中配置shiro的web过滤器:
<!-- Shiro的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/login.jsp"/>
<!--在此处配置无权限的跳转路径-->
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>
<property name="filters">
<util:map>
<entry key="authc" value-ref="formAuthenticationFilter"/>
</util:map>
</property>
<property name="filterChainDefinitions">
<value>
/login.jsp = authc
/logout = logout
/authenticated.jsp = authc
/** = user
</value>
</property>
</bean>
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>这种方法容易出现问题失效没有反应。这里处理也比较笼统不太实用。
2、在前端控制器spring-mvc.xml中配置:
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 这里你可以根据需要定义N多个错误异常转发 -->
<prop key="org.apache.shiro.authz.UnauthorizedException">redirect:/nons/noAuth.html</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/nons/noAuth.html</prop>
<prop key="java.lang.IllegalArgumentException">/redirect:/anons/bizError.html</prop> <!-- 参数错误(bizError.jsp) -->
<prop key="java.lang.Exception">/redirect:/unknowError.html</prop> <!-- 其他错误为'未定义错误'(unknowError.jsp) -->
</props>
</property>
</bean>
3、注解和配置配合使用和方法二类似只是可以添加更多的类容提示:Controller类中创建默认异常处理方法,通过注解定义条件;
package cn.bjyy.shiro.controller.exception;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @author ZCL
*/
@ControllerAdvice
public class DefaultExceptionHandler {
/**
* 没有权限 异常
* 后续根据不同的需求定制即可
*/
@ExceptionHandler({UnauthorizedException.class})
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public ModelAndView processUnauthenticatedException(HttpServletRequest request, UnauthorizedException e) {
System.out.println("没有权限异常111");
ModelAndView mv = new ModelAndView();
mv.addObject("exception", e);
mv.setViewName("unauthorized");
return mv;
}
@ExceptionHandler({Exception.class})
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView processAuthorizationExceptionException(HttpServletRequest request, UnauthorizedException e) {
System.out.println("没有代码错误异常222");
ModelAndView mv = new ModelAndView();
mv.addObject("exception", e);
mv.setViewName("unauthorized");
return mv;
}
}
再在spring-mvc中配置控制器异常处理
<!-- 控制器异常处理 -->
<bean id="defaultExceptionHandler" class="cn.bjyy.shiro.controller.exception.DefaultExceptionHandler"/>
<bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
这只是我个人实际中遇到的问题,有不对的地方请包涵,工作不久欢迎指导。