![](/img/trans.png)
[英]Asynch http requests from spring mvc controller to update div contents?
[英]Spring MVC - allowing requests from localhost only to specific controller
我有一個特定的控制器(在許多其他控制器中)。 我想允許僅從本地主機調用的對這個控制器的請求。 什么是最好的方法來做到這一點?
這是控制器:
@Controller
public class LocalProvider {
@RequestMapping(value = "/someURL", method = RequestMethod.POST)
@ResponseBody
public responseDTO doSomethingForLocalRequest(@RequestBody ReqDTO reqDTO ) {
//do something
}
編輯 :
通過將以下內容添加到 spring security.xml 中,成功實現了這一目標:
<intercept-url pattern="/someURL/*" access="hasIpAddress('127.0.0.1')" />
我將創建一個自定義注釋@LocalhostOnly
和一個 MVC 攔截器,用於檢查處理程序方法是否使用@LocalhostOnly
注釋,在這種情況下,檢查從HttpServletRequest.getRemoteAddr()
獲取的遠程 IP 地址是否確實是本地主機。
如果您正在使用 spring 安全性,那么正如 NimChimpsky 建議的那樣,最好將遠程 ip 檢查插入其中。 您可以定義一個自定義權限評估器來檢查遠程 IP 地址。
您還可以使用 servlet 過濾器並在那里對特定 URL(例如/someURL**
)進行本地主機檢查。
最后,請注意,如果您將在某個時候在反向代理后面運行應用程序,則所有請求看起來都來自本地主機(即,如果反向代理安裝在同一主機上)。 在這種情況下,您需要從X-Forwarded-For
標頭中獲取 IP 地址。
編輯
Spring security 實際上有 ip 檢查表達式hasIpAddress('127.0.0.1')
所以 NimChimpsky 的答案可能是最好的方法。
spring-security 提供了可用於類型或方法的 @PreAuthorize 注釋,因此<intercept-url>
的替代方案可以是@PreAuthorize("hasIpAddress('127.0.0.1')")
要限制對整個網絡服務器的訪問,您可以使用
<Connector port="8080" address="127.0.0.1" maxHttpHeaderSize="8192"
在 tomcat 的服務器 xml 中(或在不同的應用程序服務器中類似)。
對於一個應用程序,使用添加 allow="localhost" 到上下文:
<Context>
<Valve className="org.apache.catalina.valves.RemoteHostValve" allow="localhost"/>
</Context>
但是對於特定的控制器方法,最好使用 spring 安全性。
解決方案是使用以下表達式:
@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())")
正如第一條評論所建議的那樣,如果缺少@P("request") HttpServletRequest
參數,則使用#request
將顯示Failed to evaluate expression
錯誤。
完整解決方案:
@PreAuthorize("#request.getRemoteAddr().equals(#request.getLocalAddr())")
@PostMapping("/doSomething")
public void myMethod(@P("request") HttpServletRequest request) {
...
}
這是一個可能的解決方案:
腳步:
ServletRequest.getServerName(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.