대부분의 시스템에서는 다양한 사용자가 볼 수 있는 콘텐츠를 결정하기 위해 권한 관리가 필요합니다. 그렇다면 Spring MVC에서 권한 확인을 구현하는 방법은 무엇일까요? 물론 이를 달성하기 위해 서블릿의 Filter 필터를 계속 사용할 수 있습니다. 그러나 Spring MVC의 액션 인터셉터를 사용하면 주석 기반 권한 확인을 구현할 수 있습니다.
SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명. 먼저 액션 인터셉터를 소개합니다.
HandlerInterceptor는 자체 처리 로직을 구현할 수 있도록 Spring MVC에서 제공하는 인터셉터 인터페이스입니다.
public interface HandlerInterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
인터페이스에 3가지 메소드가 있는 것을 볼 수 있으며, 그 의미는 다음과 같습니다.
preHandle: 액션에서 처리 로직을 실행하기 전에 실행되며 boolean, 여기서 true를 반환하면 postHandle을 계속 실행하고 afterCompletion을 실행하고, false를 반환하면 실행을 중단합니다.
postHandle: 액션에서 로직을 실행한 후 뷰로 돌아오기 전에 실행됩니다. afterCompletion: 작업이 뷰로 돌아온 후 실행됩니다. HandlerInterceptorAdapter 어댑터는 HandlerInterceptor 사용을 용이하게 하기 위한 Spring MVC의 기본 HandlerInterceptor 구현입니다. 내부의 세 가지 메소드는 어떤 처리도 수행하지 않으므로 preHandle 메소드는 직접 true를 반환하므로 이후에 세 가지만 구현하면 됩니다. HandlerInterceptorAdapter 상속 메소드에서는 3개의 메소드가 필요한지 여부에 관계없이 구현해야 하는 HandlerInterceptor를 상속하는 것과 달리 필요한 메소드만 필요합니다. 물론 HandlerInterceptor의 도움으로 로깅, 요청 처리 시간 분석 등 다양한 기능을 구현할 수 있으며 권한 확인은 그 중 하나일 뿐입니다.package com.demo.web.controllers;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping(value = "/account")public class AccountController { @RequestMapping(value="/login", method = {RequestMethod.GET}) public String login(){ return "login"; } }views 폴더 아래에서 login.jsp 보기:
nbsp;html PUBLIC "-//W3C//DTD HTML 4.0SpringMVC 학습 시리즈 (9) Annotation 기반 권한 확인을 구현하는 코드에 대한 자세한 설명 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><meta><title>Insert title here</title> 这里是登录界面새 패키지 com. 데모.web.auth에 사용자 정의 주석 AuthPassport를 추가하면 내용은 다음과 같습니다.
package com.demo.web.auth;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Documented @Inherited @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)public @interface AuthPassport { boolean validate() default true; }HandlerInterceptorAdapter에서 상속된 AuthInterceptor를 구현하기 위해 자체 인터셉터를 추가하면 내용은 다음과 같습니다. :
package com.demo.web.auth;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AuthInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if(handler.getClass().isAssignableFrom(HandlerMethod.class)){ AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class); //没有声明需要权限,或者声明不验证权限 if(authPassport == null || authPassport.validate() == false) return true; else{ //在这里实现自己的权限验证逻辑 if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理) return true; else//如果验证失败 { //返回到登录界面 response.sendRedirect("account/login"); return false; } } } else return true; } }구성 프로젝트의 springservlet-config.xml에 다음 내용을 추가합니다.
<interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean annotation></bean> <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> <bean></bean></interceptors>이렇게 하면 각 작업을 실행할 때 AuthInterceptor 처리가 호출됩니다. 작업에 우리가 정의한 AuthPassport 주석이 있는 것으로 확인되면 내부의 권한 확인 논리가 실행됩니다. 프로젝트 실행: springservlet-config.xml에서 정의한 HelloworldController의 index 메소드가 실행되는 것을 확인할 수 있습니다.
아아아아
下面我们在HelloworldController的index方法上加上自定义注解AuthPassport:
@AuthPassport @RequestMapping(value={"/index","/hello"})public ModelAndView index(){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("index"); return modelAndView; }
重新运行项目:
可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。
注解式权限验证的内容到此结束。
以上就是SpringMVC学习系列(9) 之 实现注解式权限验证的代码详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!