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 [email protected]:80: java.net.SocketException: 許可權不夠 2012-09-13 20:37:18.078:INFO::Started [email protected]: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

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