scheme
속성을 사용하여 s:url
태그를 사용하여 일부 URL을 만들려고합니다.이 값은 일부 기준에 따라 동적으로 달라집니다 (예 : 일부 URL은 http
, 일부 URL은 https
). 애플리케이션의 s:url
은 모두 주어진 요청에 대해 http
또는 https
으로 생성됩니다.s : url 태그에서 동적으로 스키마 속성을 설정하는 방법?
나는이 기준에 대한 논리를 프로그램 내 행동에 문자열 필드로 사용하는 스키마 (http
또는 https
)에 저장,하지만 난 s:url
태그의 scheme
속성에 표현식을 사용할 수 없습니다 것 같다 있습니다 :
나는이 함께 구축 된 URL 사용하여 HTML 앵커를 렌더링 할 때 :
<s:url scheme="%{myScheme}" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
<s:a href="%{myUrl}">click me</s:a>
를 내가 얻을 :
<a href="%{myScheme}://myhost.com/mywebapp/MyAction.action?someParam=blah">click me</a>
또한 실제 작업 속성을 사용하지 않아도 추악한 일을 시도했습니다 (실제로 작동하면 실제 값에 대한 리터럴이 변경됩니다). 스크립틀릿 사용하려고 :
<s:url scheme="<%= "https" %>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
을하지만 500
오류 및이 로그 메시지를 받았습니다 :
org.apache.jasper.JasperException: /path/to/my/file.jsp(123,456) According to TLD or attribute directive in tag file, attribute scheme does not accept any expressions
나는 다음과 같은 추한 옵션도 시도 작동하지 않았다 :
<s:url scheme="<s:property value="myScheme"/>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
을
및 :
<s:url scheme="<c:out value="${myScheme}"/>" id="myUrl" action="MyAction" includeParams="none">
<s:param name="someParam" value="blah"/>
</s:url>
그래서 생각이 다 떨어졌습니다. 아무도 똑같은 문제에 직면 했습니까? 질문의 나머지 부분이 왜 이렇게해야하는지 설명합니다.
내 응용 프로그램은 HTTPS 요청을 수신하지만 HTTP를 사용하여 응용 프로그램 서버로 전달한 다음 HTTPS를 사용하여 응답을 인터넷으로 다시 보내는 부하 분산 장치 뒤에 있습니다. . 따라서 응용 프로그램 서버는 항상 HTTP
트래픽을 수신합니다.
로드 밸런서를 통해 요청할 때 애플리케이션의 링크를 생성해야하므로 (인터넷 사용자는 보안 될 수 있음) 개발자가 직접 프런트 엔드에 액세스해야 할 때 http를 사용해야합니다. 우리의 내부 네트워크). 나는 서버 구성이나 시스템 관리자에 대한 영향력이 없으므로 서버 또는 네트워크 구성을 변경하는 것이 다소 문제가있는 것처럼 보입니다.
UPDATE 내가 renderUrl
메서드를 재정의 org.apache.struts2.components.ServletUrlRenderer
Struts2 클래스를 확장하면 내가 원하는 것을 할 수있을 것으로 보인다. 하지만 Struts2에게 ServletUrlRenderer
대신에 UrlRenderer
이라는 사용자 정의 구현을 사용하도록 말할 방법을 모르겠습니다.
이것은 응용 프로그램의 보안 구멍 일 수 있습니다. 변경을 요청하는 것이 더 좋을 것입니다. 태그 –
@ LukaszLenart 의견을 보내 주셔서 감사합니다. 사용하려는 프로토콜이 저장되는 위치를 변경하려고합니다. 그래서 "scheme"매개 변수를 사용하여 요청하면 응용 프로그램의 예상 동작이 변경되지 않습니다. 어쨌든 시스템 관리자와 CIO가 만든 가이드 라인에 묶여 있기 때문에 아키텍처가 좋지 않아도 내 앱에서 "https"링크가 생성되도록하고 싶습니다. – orique