Linux下報 java.net.SocketException權限不夠 異常解決


 

轉載自:http://wangchongan.com/articles/java-net-socket-exception-permission-denied.html

 

今天在Linux下用Jetty把一個應用啟動起來報權限不夠異常。其實原因很簡單,但是如果一時疏忽可能會習慣性地google一把,我就google了一把,但是發現網上關於這個問題的內容很少。所以我特記錄一下,希望能給遇到同樣問題的同學有幫助。

 

異常內容如下:

HSFJettyWebAppContext replace servlet context get file /tmp/hsf_jetty_placeholder/WEB-INF/common/webx-component-and-root.xml
Web Context替換文件到【/tmp/hsf_jetty_placeholder/WEB-INF/common/webx-component.xml】
2012-09-13 20:37:17.930:INFO:/:WebxComponents: initialization completed
2012-09-13 20:37:17.975:INFO:/:Initializing filter: mdc
2012-09-13 20:37:17.976:INFO:/:SetLoggingContextFilter – mdc: initialization completed
2012-09-13 20:37:17.976:INFO:/:Initializing filter: webx
2012-09-13 20:37:17.980:INFO:/:WebxFrameworkFilter – webx: initialization completed
2012-09-13 20:37:18.077:WARN::failed SelectChannelConnector@0.0.0.0:80: java.net.SocketException: 權限不夠
2012-09-13 20:37:18.078:INFO::Started Ajp13SocketConnector@0.0.0.0:8009
2012-09-13 20:37:18.079:INFO::AJP13 is not a secure protocol. Please protect port 8009
2012-09-13 20:37:18.079:WARN::failed Server@4950b45a: java.net.SocketException: 權限不夠
java.net.SocketException: 權限不夠
    at sun.nio.ch.Net.bind(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:126)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216)
at org.mortbay.jetty.nio.SelectChannelConnector.doStart(SelectChannelConnector.java:315)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.Server.doStart(Server.java:235)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at runjettyrun.Bootstrap.main(Bootstrap.java:259)

 

【推薦解決辦法】

原因其實是因為在linux下,如果使用1024以下的端口則需要root權限,所以因為我當前使用的不是root權限,所以權限不足而無法使用80端口,所以會報權限不夠異常。把Jetty的HTTP端口改為非80端口且大於1024的端口,比如8080即可。

 在pom.xml中修改端口號。

【其他解決方案】

如果就是要使用80端口訪問應用,那么還有辦法嗎?答案是肯定的,我們可以使用iptables命令解決。

我們可以通過以下命令設置將80端口轉發到8080端口,這樣eclipse中的jetty插件還是可以綁定在8080端口,/etc/hosts綁定本地到日常的域名也可以通過80端口自動轉發,這樣就很方便了。

tables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 –dport 80 -j REDIRECT –to-ports 8080

 

不需要時可以清除掉:

iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT

 

上述設置是臨時的,如果重啟后該設置就會失效,如果想讓你的配置在重啟后仍然有效,可以參考這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM