2013-03-22 3 views
3

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이라는 사용자 정의 구현을 사용하도록 말할 방법을 모르겠습니다.

답변

2

질문을 업데이트 할 때 고급 답변을 찾았습니다.

  • s:url 태그의 scheme 속성은 표현 만 리터럴 값을 지원하지 않습니다

    내 연구 결과는 점이다.

  • Struts2의 기본 동작을 변경해야했습니다.

는 그래서 내가 무슨 짓을했는지 :

  • 내 응용 프로그램의 모든 JSP를 모든 s:url 태그의 모든 scheme 속성을 제거.
  • ServletUrlRenderer 거의 사본을 사용하여 사용자 정의 클래스로 UrlRenderer을 구현했습니다. renderUrl 메서드가 String scheme = ActionContext.getContext().getValueStack().findString("scheme");을 사용하여 구성표의 기본값을 검색하는 줄을 변경했습니다. 이것은 scheme의 기본값을 현재 Action의 "scheme"속성으로 설정합니다.
  • struts.properties에 다음 속성을 추가했습니다. 나는 스트럿츠의 2.3.8 버전에서 몇 가지 코드를 붙여 넣은 복사하기 때문에

struts.urlRenderer = fully.qualified.name.for.my.CustomUrlRendererImplementation

이 솔루션은 유지 보수 문제를 소개합니다 :이 속성은 Struts2 내 사용자 정의 구현을 사용하도록 지시합니다. 더 나은 해결책이있는 사람이 있다면 시험해 보겠습니다. :)

+1

이것은 응용 프로그램의 보안 구멍 일 수 있습니다. 변경을 요청하는 것이 더 좋을 것입니다. 태그 –

+0

@ LukaszLenart 의견을 보내 주셔서 감사합니다. 사용하려는 프로토콜이 저장되는 위치를 변경하려고합니다. 그래서 "scheme"매개 변수를 사용하여 요청하면 응용 프로그램의 예상 동작이 변경되지 않습니다. 어쨌든 시스템 관리자와 CIO가 만든 가이드 라인에 묶여 있기 때문에 아키텍처가 좋지 않아도 내 앱에서 "https"링크가 생성되도록하고 싶습니다. – orique

+1

의 문제를 등록하십시오. 유효한 사용법입니다. 케이스 :-) https://issues.apache.org/jira/browse/WW –

0

이걸 이해하기 힘듭니다 ... syscall : myscheme의 값을 설정하고 jsp 변수를 사용하도록 설정하십시오.

+0

감사합니다 panky1986, 시도했지만 행운은 없었습니다. ( – orique

관련 문제