예시
- 네트워크 상에는 다수의 서버가 존재 (ex: naver서버, daum서버)
만약 이메일과 같은 패킷통신이라면 수신자에 상관없이 naver서버, daum서버 모두에게 데이터가 전달됨.- request line에 수신자정보가 naver라고 되어있다면?
- daum이 열어보고 '엥 네이버자나 쓸 필요없네' 하고 버림
- 결론 : request line의 정보는 모두에게 노출될 수 밖에 없는 구조
- 이때문에 라인을 통한 데이터 전달 방식이 위험한 것임
클라이언트가 전송한 요청에서 시스템에 대한 정보를 추출한 다음,
최종적으로 클라이언트에게 '당신의 브라우저는 "크롬"입니다.'형태의 메시지 전송 (enum 문법 활용)
크롬이라면 크롬이라는 한글데이터, 엣지면 엣지라고 한글
String agent = request.getHeader("user-agent");
String name = null;
if(agent.contains("Edg")){
name = "엣지";
}else if(agent.contains("Chrome")){
name = "크롬";
}else if(agent.contains("Trident")){
name = "익스플로러";
}else {
name = "기타";
}
String agent = request.getHeader("user-agent");
String name = "기타";
Map<String, String> browsers = new LinkedHashMap<>();
/*
* 일반 HashMap이 아닌 LinkedHashMap을 사용하는 이유
* - 엣지에 크롬, 엣지 둘다 들어있기 때문에 엣지 먼저 비교하려고 -> 순서 중요
* - LinkedHashMap은 순서가 유지될 수 있다 -> Linked계 구현체의 특징
*/
browsers.put("Edg","엣지");
browsers.put("Chrome","크롬");
browsers.put("Trident","익스플로러");
for(Entry<String, String> entry : browsers.entrySet()) {
if(agent.contains(entry.getKey())){
name = entry.getValue();
break; // 조건 충족되니 break
}
}
<%! // 디렉티브: 선언부
enum Browser { // 자기 타입에 해당하는 객체를 미리 만들어놓는 구조. 외부에서 객체 생성 불가능.
EDG("엣지"), CHROME("크롬"), TRIDENT("익스플로러"), OTHER("기타");
private String browserName;
/*
* 매개변수 있는 생성자 정의
* - 이로써 기본생성자는 없어지게되므로 EDG, CHROME, TRIEDENT로 선언시 컴파일오류발생
*/
Browser(String browserName){
this.browserName = browserName;
}
public String getBrower(){
return browserName;
}
}
%>
<%
String agent = request.getHeader("user-agent");
String name = "기타";
Browser[] browsers = Browser.values(); // values() : enum 메서드, 해당 객체배열 반환
for(Browser temp : browsers) {
if(agent.toUpperCase().contains(temp.name())){
name = temp.getBrower();
}
}
%>
<%!
enum Browser { // 자기 타입에 해당하는 객체를 미리 만들어놓는 구조. 외부에서 객체 생성 불가능.
EDG("엣지"), CHROME("크롬"), TRIDENT("익스플로러"), OTHER("기타");
private String browserName;
Browser(String browserName){
this.browserName = browserName;
}
public String getBrower(){
return browserName;
}
public static String getBrowserName(String agent){
Browser[] browsers = values();
Browser finded = OTHER;
for(Browser temp : browsers) {
if(agent.toUpperCase().contains(temp.name())){
finded = temp;
break;
}
}
return finded.getBrower();
}
}
%>
<%
String agent = request.getHeader("user-agent");
String name = Browser.getBrowserName(agent);
%>
package kr.or.ddit.enumpkg;
public enum Browser { // 자기 타입에 해당하는 객체를 미리 만들어놓는 구조. 외부에서 객체 생성 불가능.
EDG("엣지"), CHROME("크롬"), TRIDENT("익스플로러"), OTHER("기타");
private String browserName;
Browser(String browserName){
this.browserName = browserName;
}
public String getBrower(){
return browserName;
}
public static String getBrowserName(String agent){
Browser[] browsers = values();
Browser finded = OTHER;
for(Browser temp : browsers) {
if(agent.toUpperCase().contains(temp.name())){
finded = temp;
break;
}
}
return finded.getBrower();
}
}
<%@page import="kr.or.ddit.enumpkg.*" %>
<%
String agent = request.getHeader("user-agent");
String name = Browser.getBrowserName(agent);
%>
당신의 브라우저는 <%=name %>입니다.
<body>
<%
String acceptLanguage = request.getHeader("accept-language");
Locale locale = request.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("kr.or.ddit.msg.message", locale);
String message = bundle.getString("bow");
%>
<pre>
accept-lanugage : <%=acceptLanguage %>
<%=message %> // 로케일을 식별해주지 않으면 서버의 로케일을 따라가 안녕하세요가 출력됨
</pre>
</body>
$(".flag").on("click", function(event) {
let language = $(this).prop("id");
$.ajax({
url: "<%=request.getContextPath()%>/02/getMessage.jsp"
,data: { lang : language } // "lang" 안해줘도도는건 js객체기때문에 js객체는 이걸 알아서 식별해줌
,method:"get" // 기본이니 생략가능
,dataType:"text" // 리퀘스트헤더의 mime을 결정 Accept : application/json | response의 Content-Type과 한쌍
,success: function(resp) { // jqeury 컨텍스트가 콜백함수호출, dataType에따라 resp타입 달라짐
$("#resultArea").text(resp);
}
,error: function(xhr) { // 비동기요청시 기존사용했던 api객체(XMLHttpRequest) 이용하기때문에 에러보기위해 요청,응답정보 다시가져옴
console.log(xhr.status);
}
});
});
<%@page import="java.util.ResourceBundle"%>
<%@page import="java.util.Locale"%>
<%@ page language="java" contentType="text/plain; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String language = request.getParameter("lang");
String acceptLanguage = request.getHeader("accept-language");
Locale locale = request.getLocale();
if(language!=null && !language.isEmpty()) {
locale = Locale.forLanguageTag(language.toLowerCase());
}
ResourceBundle bundle = ResourceBundle.getBundle("kr.or.ddit.msg.message", locale);
String message = bundle.getString("bow");
%>
<%=message %>