<a th:id="|answer_${answer.id}|"></a>
Maven Repository: org.commonmark » commonmark » 0.22.0 (mvnrepository.com)
만약 마크다운으로 바꿔주고 나서 th:utext를 통해서 문법을 알아서 변환하게 해주면 XSS에 굉장히 취약해진다.
코드가 그대로 실행되기 때문에.
String content = commonUtil.markdown(questionForm.getContent());
questionService.create(questionForm.getSubject(), content, siteUser);
@Component
public class CommonUtil {
public String markdown(String markdown) {
Parser parser = Parser.builder().build();
Node doc = parser.parse(markdown);
HtmlRenderer renderer = HtmlRenderer.builder().build();
return renderer.render(doc);
}
}
String covertcontent = commonUtil.markdown(answerForm.getContent());
Answer answer = answerService.create(question,covertcontent, siteUser);
기본 제목 검색을 진행한다고 가정해보자. 필요한게 뭐가 있을까?
querydsl 라이브러리 추가
//QueryDsl 추가
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
QEntity를 만들어 주고 난 후에 Query문을 처리하는 QuestionQueryRepository를 추가를 하기전에 controller와 repository,contoller를 package로 나눠놓자.
Querydsl은 작성 끝 html 에 제대로 안나오는 문제
List<Question> list = queryFactory
.selectFrom(question)
.where(question.subject.contains(subject))
.orderBy(question.createDate.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
question_list.html에 검색창 추가하기.
<div class="col-6">
<a th:href="@{/question/create}" class="btn btn-primary">질문 등록하기</a>
</div>
<div class="col-6">
<div class="input-group">
<input type="text" id="search_kw" class="form-control" th:value="${sub}">
<button class="btn btn-outline-secondary" type="button" id="btn_search">찾기</button>
</div>
</div>
</div>
찾기 버튼을 누르면 get input값을 통해서 get 방식으로 요청할 수 있게 추가
<form th:action="@{/question/list}" method="get" id="searchForm">
<input type="hidden" id="sub" name="sub" th:value="${sub}">
<input type="hidden" id="page" name="page" th:value="${paging.number}">
</form>
검색 스크립트 추가
<script layout:fragment="script" type='text/javascript'>
const page_elements = document.getElementsByClassName("page-link");
Array.from(page_elements).forEach(function(element) {
element.addEventListener('click', function() {
document.getElementById('page').value = this.dataset.page;
document.getElementById('searchForm').submit();
});
});
const btn_search = document.getElementById("btn_search");
btn_search.addEventListener('click', function() {
document.getElementById('sub').value = document.getElementById('search_kw').value;
document.getElementById('page').value = 0; // 검색버튼을 클릭할 경우 0페이지부터 조회한다.
document.getElementById('searchForm').submit();
});
</script>