봄 부팅 고급 튜토리얼 시리즈 엔트리에서 - 통합 구성 프리 마커


1 단계 우리는, 프리 마커 기본 구성의 application.properties를 구성하는 첫 번째 튜토리얼을 참조 할 수 있습니다 [봄 부팅 고급 튜토리얼 시리즈 엔트리에서 - 외부 톰캣 멀티 모드, 암호화 및 구성 데이터의 암호 해독을 시작합니다]

코어 구성

################################################## ######
### 프리 마커
######################################## ################
spring.freemarker.allow 요청 오버라이드 (override) = 거짓
spring.freemarker.cache = 사실
spring.freemarker.check 템플릿 - 위치 = 사실
spring.freemarker.charset = UTF-8
spring.freemarker.content 형 = text / html과
spring.freemarker.expose 요청 - 속성 = 거짓
spring.freemarker.expose-세션 속성 = 거짓
spring.freemarker.expose 스프링 매크로 헬퍼 = 거짓
spring.freemarker.suffix = .ftl
spring.freemarker.template 로더 경로 = / WEB-INF / FTL /


2 단계 우리의 결정 역할 권한 레이블 구현 클래스를 준비, 우리는 템플릿 페이지 프리 마커를 사용

예상하거나 사용자가 해당 화면 HTML 콘텐츠 USER1 USER2의 역할을 가지고 있다면

<@hasRole 역할 = "USER1, USER2">
<a보기 </a>我拥有USER1或者USER2角色权限</a>를
</ @ hasRole>
@Component
공용 클래스 HasRoleTag TemplateDirectiveModel가 {구현

공공 무효 실행 (환경 ENV, 지도 PARAMS, TemplateModel [] loopVars, TemplateDirectiveBody directiveBody는)
TemplateException, IOException가 {던졌습니다
개체 역할 = params.get ( "역할을");
경우 (StringUtils.isEmpty (역할)) {
새로운 TemplateException를 발생 ( "参数[역할]不能为空을", NULL);
}
경우 (hasRole (역할)) {
directiveBody.render (env.getOut ());
} 다른 {
. env.getOut는 () ( "") 쓰기;






(문자열 checkRole : 역할)에 대해 {
// TODO 여기서 사용자는 해당 세션이 존재 true를 돌려 같은 checkRole 존재 하는지를 판정
}
거짓을 반환
}

}

XSS 공격의 예방을 달성해야하는 이유 3 단계? 우리의 데이터가 많은 경우에 XSS 스크립트 라이브러리를 존재, 시간 데이터가 포함 된 XSS 스크립트는 사용자 세션을 훔치는 등 일부 악의적 인 페이지 효과가 될 것이다 볼 수 일반적인 배경 관리자 또는 사용자로 이어질 쿠키 세션 ID 또는 악의적 인 공격의 결과 페이지, 또는 더욱 심각한 사용자 데이터 보안 및 사용자 경험을위한 큰 도전이다 피싱 사이트로 안내되어, 당신에게 무제한의 팝업을 허용합니다.

XSS는 페이지 JS 스크립트의 효과에 의해 주로 수행되는, 그래서 우리는 스크립팅 공격의 90 %까지 방지 할 수 있습니다 우리가 보여줄 필요가 데이터를 탈출하는 가장 일반적인 방법을 사용

다음의 예

<#escape X 같은 X HTML?>
이 데이터베이스의 내용을 읽기에서 읽기 : I 콘텐츠, 내가 당신에게 오늘 그것을 먹을 향하고
<스크립트> 경고 ( "나는 XSS 스크립트입니다"); </ SCRIPT>
< / # 탈출>

그러나 페이지의 많은 부분에있는 모든 데이터를 우리가 글로벌 교체를 고려할 수, 너무 많은 중복 코드를 작성하는 독립의 필요성을 보여주기 위해이 시간을 필요로하는 경우 다음과 같이 코드는

공용 클래스 HtmlTemplateLoader이 TemplateLoader {구현

개인 정적 최종 문자열을 HTML_ESCAPE_PREFIX = "<? #escape X 같은 X HTML>";
개인 정적 최종 문자열 HTML_ESCAPE_SUFFIX = "</ # 탈출>";

민간 최종 TemplateLoader 위임;

공개 HtmlTemplateLoader (TemplateLoader 대리자) {
this.delegate = 대리인;
}

@Override
공공 개체 findTemplateSource (문자열 이름) IOException가 {던졌습니다
delegate.findTemplateSource (이름)을 반환;
}

@Override
공공 만약 찾게된다면 long getLastModified (개체 templateSource) {
delegate.getLastModified (templateSource)을 반환;
}

@Override
공공 리더 대해 getReader은 (templateSource, 문자열 인코딩 개체) IOException가 {던졌습니다
리더 리더 = delegate.getReader (templateSource, 인코딩);
문자열 templateText = IOUtils.toString (리더);
새로운 StringReader를을 반환 (HTML_ESCAPE_PREFIX + templateText + HTML_ESCAPE_SUFFIX);
새로운 StringReader를 (templateText)을 반환 //;
}

@Override
공공 무효 closeTemplateSource (개체 templateSource)는 IOException가 {던졌습니다
delegate.closeTemplateSource (templateSource를);
}

}


4 단계 우리는 초기화 프리 마커 구성 및 서면 우리의 이상 분사 기능 코드의 사용을 시작

@Configuration
공용 클래스 FreeMarkerConfig {

@Autowired (필수 = false)를
개인 freemarker.template.Configuration 구성;
@Autowired (필수 = 거짓)
전용 HasRoleTag hasRoleTag;


@PostConstruct
공공 무효 setSharedVariable을 () {
//数据转义
configuration.setTemplateLoader (새 HtmlTemplateLoader (configuration.getTemplateLoader ()));
//基本设置
configuration.setNumberFormat ( "# ####.");
configuration.setDateFormat ( "YYYY-MM-DD");
configuration.setDateTimeFormat ( "YYYY-MM-DD HH : MM : SS");
configuration.setLocale (새 로케일 ( "zh_CN으로"));
configuration.setSharedVariable ( "hasRole", hasRoleTag);
}

}

개요, 전역 변수가 탈출 태그를 사용하는 페이지 우리는 더 이상 출력 데이터가 될 수있다 { ''! model.content} 일반적인 $에 추가 코드를 작성할 필요가 없지만, 어떤 사람들은 우리가 서식있는 텍스트 데이터를 사용할 것을 요청할 수 있습니다 그것을 수행하는 방법, 우리는 우리가 또 다른 후속 안전 손잡이를 한 리치 텍스트를 설명 할 것입니다,이 상황을 데이터 노드 중 하나를 벗어날 수 없다


---------------------

추천

출처www.cnblogs.com/liyanyan665/p/11257599.html