SpringMVC 차단기 상세 설명(자원 및 권한 관리)
1.DispatcherServlet
SpringMVC 는 통 일 된 입구 디 스 패 치 서버 를 가지 고 있 으 며 모든 요청 은 디 스 패 치 서버 를 통 해 이 루어 집 니 다.
Dispatcher Servlet 은 웹.xml 파일 에 설 치 된 사전 컨트롤 러 입 니 다.일치 하 는 요청 을 차단 합 니 다.Servlet 차단 일치 규칙 은 스스로 정의 하고 차단 한 요청 을 특정한 규칙 에 따라 목표 Controller 에 나 누 어 처리 해 야 합 니 다. 그래서 우 리 는 현재 웹.xml 에 다음 설정 을 추가 합 니 다:
<!-- DispatcherServlet , web WEB-INF [servlet- ]-servlet.xml ,
Beans, Beans -->
<servlet>
<servlet-name>springMybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMybatis</servlet-name>
<!-- , DispatcherServlet -->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.정적 자원 차단 하지 않 음*.do 형식 과 유사 한 url 만 설정 하면 정적 자원 에 대한 접근 은 문제 가 없 지만 모든 요청(예 를 들 어 위 에서 설정 한"/")을 차단 하면 js 파일,css 파일,그림 파일 등 정적 자원 에 접근 할 수 없습니다.
일반적으로 차단 기 를 실현 하 는 것 은 권한 관 리 를 위 한 것 이 고 주로 url 요청 을 차단 하기 때문에 정적 자원 을 차단 하지 않 습 니 다.정적 자원 을 걸 러 내 려 면 보통 두 가지 방법 이 있 습 니 다.
첫 번 째 는
<!-- servlet tomcat,jetty , / /static/ , http://localhost/foo.css , http://localhost/static/foo.css -->
<!-- -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/images/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
</servlet-mapping>
Tomcat, Jetty, JBoss, and GlassFish 기본 Servlet 이름--"default"Resin 기본 Servlet 이름--"resin-file"
WebLogic 기본 Servlet 이름 -- "FileServlet"
WebSphere 기본 Servlet 의 이름--"Simple FileServlet"
모든 웹 응용 서버 의 기본 Servlet 이름 이"default"가 아니라면 default-servlet-name 속성 을 통 해 지정 해 야 합 니 다.
<mvc:default-servlet-handler default-servlet-name=" Web Servlet " />
두 번 째 는
<mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>
<mvc:resources mapping="/styles/**" location="/static_resources/css/"/>
<mvc:resources mapping="/images/**" location="/static_resources/images/"/>
3.사용자 정의 차단기SpringMVC 의 차단기 Handler InterceptorAdapter 는 세 개의 preHandle,post Handle,after Complete 방법 을 제공 합 니 다.preHandle 은 비 즈 니스 프로세서 처리 요청 전에 호출 되 었 습 니 다.
post Handle 은 비 즈 니스 프로세서 처리 요청 이 실 행 된 후 보 기 를 만 들 기 전에 실 행 됩 니 다.after Complete 는 Dispatcher Servlet 에서 요청 을 완전히 처리 한 후 호출 되 어 자원 정리 등에 사용 할 수 있 습 니 다.따라서 자신의 권한 관리 논 리 를 실현 하려 면 Handler InterceptorAdapter 를 계승 하고 세 가지 방법 을 다시 써 야 한다.
우선 springmvc.xml 에 자신 이 정의 한 차단 기 를 추가 합 니 다.
<!-- , , -->
<mvc:interceptors>
<mvc:interceptor>
<!-- url , /**, Controller -->
<mvc:mapping path="/" />
<mvc:mapping path="/user/**" />
<mvc:mapping path="/test/**" />
<bean class="com.alibaba.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
<!-- , preHandle , postHandle afterCompletion -->
</mvc:interceptors>
나의 차단 논 리 는 로그 인하 지 않 기 전에 모든 방문 url 이 login 페이지 로 이동 하 는 것 입 니 다.로그 인 성공 후 이전 url 로 이동 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
/**
*
*/
package com.alibaba.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.alibaba.util.RequestUtil;
/**
* @author tfj
* 2014-8-1
*/
public class CommonInterceptor extends HandlerInterceptorAdapter{
private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
public static final String LAST_PAGE = "com.alibaba.lastPage";
/*
*
private String mappingURL;
public void setMappingURL(String mappingURL) {
this.mappingURL = mappingURL;
}
*/
/**
*
* false
* afterCompletion(),
* true
* ,
* Controller
* ,
* postHandle()
* afterCompletion()
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if ("GET".equalsIgnoreCase(request.getMethod())) {
RequestUtil.saveRequest();
}
log.info("============== : 1、preHandle================");
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = requestUri.substring(contextPath.length());
log.info("requestUri:"+requestUri);
log.info("contextPath:"+contextPath);
log.info("url:"+url);
String username = (String)request.getSession().getAttribute("user");
if(username == null){
log.info("Interceptor: login !");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
return false;
}else
return true;
}
/**
* ,
* modelAndView ,
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("============== : 2、postHandle================");
if(modelAndView != null){ //
modelAndView.addObject("var", " postHandle");
}
}
/**
* DispatcherServlet ,
*
* , afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
log.info("============== : 3、afterCompletion================");
}
}
주:상기 코드 에 저 는 RequestUtil 을 썼 습 니 다.주로 현재 Request,Session 대상 을 가 져 오고 페이지 를 저장 하고 암호 화 하 며 꺼 내 는 등 기능 을 실현 합 니 다.이로써 차단 기 는 이미 실현 되 었 습 니 다.효 과 는 그림 과 같 습 니 다.
제 가 직접/test/hello 를 방문 하면 차단 이 됩 니 다.
로그 인 성공 후/test/hello 에 대응 하 는 페이지 로 이동 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springmvc application/octet-stream problemmistake: Source code: Solution: Summarize: application/octet-stream is the original binary stream method. If the convers...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.