SpringMVC 주해 식 권한 검증 을 실현 하 는 실례

6778 단어 springmvc주해
대부분의 시스템 에 대해 권한 관리 가 필요 합 니 다.서로 다른 사용자 가 어떤 내용 을 볼 수 있 는 지 결정 합 니 다.그러면 어떻게 Spring MVC 에서 권한 검증 을 실현 합 니까?물론 servlet 의 필 터 를 계속 사용 할 수 있 습 니 다.그러나 Spring MVC 의 action 차단 기 를 통 해 주해 식 권한 검증 을 실현 할 수 있 습 니 다.
1.액 션 차단 기 를 먼저 소개 합 니 다.
Handler Interceptor 는 Spring MVC 가 우리 에 게 제공 하 는 차단기 인터페이스 로 우리 가 자신의 처리 논 리 를 실현 하도록 한다.Handler Interceptor 의 내용 은 다음 과 같다.

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; 
}
인 터 페 이 스 를 볼 수 있 는 세 가지 방법 이 있 는데 그 의 미 는 다음 과 같다.
preHandle:action 의 처리 논 리 를 실행 하기 전에 실 행 됩 니 다.boolean 으로 돌아 갑 니 다.여기 서 true 로 돌아 가면 post Handle 과 after Complete 를 실행 하고 false 로 돌아 가면 실행 을 중단 합 니 다.
post Handle:action 의 논 리 를 실행 한 후 보기 로 돌아 가기 전에 실행 합 니 다.
after Complete:action 에서 보 기 를 되 돌려 준 후 실행 합 니 다.
Handler InterceptorAdapter 어댑터 는 Spring MVC 입 니 다.Handler Interceptor 를 편리 하 게 사용 하기 위해 Handler Interceptor 에 대한 기본 구현 입 니 다.그 안에 있 는 3 가지 방법 은 아무런 처리 도 하지 않 고 preHandle 방법 에서 true 로 직접 돌아 갑 니 다.그러면 우 리 는 Handler InterceptorAdapter 를 계승 한 후 3 가지 방법 중 우리 가 필요 로 하 는 방법 만 실현 하면 됩 니 다.Handler Interceptor 를 계승 하 는 것 처럼 세 가지 방법 이 필요 하 든 말 든 이 루어 져 야 한다.
물론 Handler Interceptor 를 통 해 우 리 는 로그 기록,처리 요청 시간 분석 등 여러 가지 기능 을 실현 할 수 있 고 권한 검증 은 그 중의 하나 일 뿐이다.
 2.주해 식 권한 검증 기능 을 한 걸음 한 걸음 완성 하 겠 습 니 다.
먼저 계 정의 Controller 와 로그 인 한 Action 및 보 기 를 추가 하여 권한 이 없 을 때 로그 인 페이지 로 이동 하 는 것 을 모 의 합 니 다.내용 은 다음 과 같 습 니 다.
com.demo.web.controllers 패키지 의 AccountController.java:

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:

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
        
</body>
</html>

새 패키지 com.demo.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;
}

자신의 차단 기 를 추가 하여 AuthInterceptor 를 Handler Interceptor Adapter 에 계승 합 니 다.내용 은 다음 과 같 습 니 다.

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 에 다음 내용 을 추가 합 니 다:

<mvc:interceptors> 
 <!--                (  /Session/Cookie)      --> 
 <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> 
 <!--       mvc:mapping path       URL   -->
 <bean class="com.demo.web.auth.AuthInterceptor"></bean>
</mvc:interceptors>
이렇게 모든 action 방법 을 실행 할 때 AuthInterceptor 를 호출 합 니 다.action 에 저희 가 AuthPassport 주 해 를 정의 할 때 권한 검증 논 리 를 실행 합 니 다.
실행 항목:

springservlet-config.xml 에서 정 의 된 Helloworld Controller 의 index 방법 을 실행 하 는 것 을 볼 수 있 습 니 다.

<!--        “/” ,    “/helloworld/index" -->
<mvc:view-controller path="/" view-name="forward:/helloworld/index"/>
다음은 Hello World Controller 의 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 에 이 주 해 를 추가 하면 권한 제어 기능 을 실현 할 수 있 습 니 다.
주해 식 권한 검증 내용 은 여기 서 마 치 겠 습 니 다. 
코드 다운로드:demo
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기