| @@ -19,21 +19,29 @@ import org.springframework.web.servlet.ModelAndView; | |||||
| @RestController | @RestController | ||||
| public class MainController extends BaseController { | public class MainController extends BaseController { | ||||
| private final static Logger logger = LoggerFactory.getLogger(MainController.class); | private final static Logger logger = LoggerFactory.getLogger(MainController.class); | ||||
| // | |||||
| // @RequestMapping(value={"/"}, method= RequestMethod.GET) | |||||
| // public ModelAndView index(@RequestParam("host")String host, | |||||
| // @RequestParam("port")int port, | |||||
| // @RequestParam("username")String username, | |||||
| // @RequestParam("password")String password, | |||||
| // @RequestParam("rows")int rows) { | |||||
| // logger.debug("/ssh: 接收到连接请求, host: {}, port: {}", host, port); | |||||
| // ModelAndView mv = new ModelAndView(); | |||||
| // mv.setViewName("index"); | |||||
| // mv.addObject("host", host); | |||||
| // mv.addObject("port", port); | |||||
| // mv.addObject("username", username); | |||||
| // mv.addObject("password", password); | |||||
| // mv.addObject("rows", rows); | |||||
| // mv.addObject("digest", System.currentTimeMillis()); | |||||
| // return mv; | |||||
| // } | |||||
| @RequestMapping(value={"/", "ssh"}, method= RequestMethod.GET) | |||||
| public ModelAndView index(@RequestParam("host")String host, | |||||
| @RequestParam("port")int port, | |||||
| @RequestParam("username")String username, | |||||
| @RequestParam("password")String password, | |||||
| @RequestParam("rows")int rows) { | |||||
| logger.debug("/ssh: 接收到连接请求, host: {}, port: {}", host, port); | |||||
| @RequestMapping(value={"/"}, method= RequestMethod.GET) | |||||
| public ModelAndView index() { | |||||
| ModelAndView mv = new ModelAndView(); | ModelAndView mv = new ModelAndView(); | ||||
| mv.setViewName("index"); | mv.setViewName("index"); | ||||
| mv.addObject("host", host); | |||||
| mv.addObject("port", port); | |||||
| mv.addObject("username", username); | |||||
| mv.addObject("password", password); | |||||
| mv.addObject("rows", rows); | |||||
| mv.addObject("digest", System.currentTimeMillis()); | mv.addObject("digest", System.currentTimeMillis()); | ||||
| return mv; | return mv; | ||||
| } | } | ||||
| @@ -1,50 +1,61 @@ | |||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||
| <html> | |||||
| <head lang="en"> | |||||
| <meta charset="UTF-8"> | |||||
| <title>webssh</title> | |||||
| <html lang="en"> | |||||
| <head> | |||||
| <meta charset="utf-8"> | |||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |||||
| <title>JWebssh</title> | |||||
| <link rel='shortcut icon' type='image/x-icon' href='/static/image/favicon.ico'/> | <link rel='shortcut icon' type='image/x-icon' href='/static/image/favicon.ico'/> | ||||
| <link rel="stylesheet" href="/static/css/pure-min.css"> | <link rel="stylesheet" href="/static/css/pure-min.css"> | ||||
| <link href="/static/css/xterm.css" rel="stylesheet" type="text/css"/> | <link href="/static/css/xterm.css" rel="stylesheet" type="text/css"/> | ||||
| <link rel='stylesheet' href='http://fonts.googleapis.com/css?family=PT+Sans:400,700'> | |||||
| <link rel="stylesheet" href="/static/css/reset.css"> | |||||
| <link rel="stylesheet" href="/static/css/supersized.css"> | |||||
| <link rel="stylesheet" href="/static/css/style.css"> | |||||
| <!-- HTML5 shim, for IE6-8 support of HTML5 elements --> | |||||
| <!--[if lt IE 9]> | |||||
| <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> | |||||
| <![endif]--> | |||||
| </head> | </head> | ||||
| <div id="main" align="center" style="display: none;"> | |||||
| <form id="form" name="form" class="pure-form pure-form-stacked"> | |||||
| <fieldset> | |||||
| <input id="terminalRow" name="terminalRow" type="text" value=${rows}> | |||||
| <div class="pure-item"> | |||||
| <label for="host">Host</label> | |||||
| <input id="host" name="host" type="text" placeholder="Host" value=${host}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <label for="port">Port</label> | |||||
| <input id="port" name="port" type="text" placeholder="Port" value=${port}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <label for="username">Username</label> | |||||
| <input id="username" name="username" type="text" placeholder="Username" value=${username}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <label for="password">Password</label> | |||||
| <input id="password" name="password" type="password" placeholder="Password" value=${password}> | |||||
| </div> | |||||
| <label for="remember" class="pure-checkbox"> | |||||
| <input id="remember" type="checkbox"> Remember me | |||||
| </label> | |||||
| <button type="button" class="pure-button pure-button-primary" onclick="connect()">Connect</button> | |||||
| </fieldset> | |||||
| </form> | |||||
| <body> | |||||
| <div class="page-container" id="form" name="form" > | |||||
| <h1>JWebssh</h1> | |||||
| <form action="" method="post"> | |||||
| <fieldset> | |||||
| <input id="terminalRow" name="terminalRow" type="hidden" value=100> | |||||
| <div class="pure-item"> | |||||
| <input id="host" name="host" type="text" placeholder="Host" value=${host}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <input id="port" name="port" type="text" placeholder="Port" value=${port}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <input id="username" name="username" type="text" placeholder="Username" value=${username}> | |||||
| </div> | |||||
| <div class="pure-item"> | |||||
| <input id="password" name="password" type="password" placeholder="Password" value=${password}> | |||||
| </div> | |||||
| <button type="button" onclick="connect()">Connect</button> | |||||
| </fieldset> | |||||
| </form> | |||||
| </div> | </div> | ||||
| <div id="term" align="center"></div> | <div id="term" align="center"></div> | ||||
| <!-- Javascript --> | |||||
| <script src="/static/js/jquerymin.js"></script> | |||||
| <script src="/static/js/supersized.3.2.7.min.js"></script> | |||||
| <script src="/static/js/supersized-init.js"></script> | |||||
| <script src="/static/js/base64.js"></script> | <script src="/static/js/base64.js"></script> | ||||
| <script src="/static/js/jquerymin.js"></script> | <script src="/static/js/jquerymin.js"></script> | ||||
| <script src="/static/js/xterm.js"></script> | <script src="/static/js/xterm.js"></script> | ||||
| <script src="/static/js/ws.js"></script> | <script src="/static/js/ws.js"></script> | ||||
| <script src="/static/js/formvalid.js"></script> | <script src="/static/js/formvalid.js"></script> | ||||
| <script src="/static/js/main.js?${digest}"></script> | <script src="/static/js/main.js?${digest}"></script> | ||||
| <script type="application/javascript"> | |||||
| $(function () { | |||||
| connect(); | |||||
| }) | |||||
| </script> | |||||
| </html> | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,44 @@ | |||||
| /* ------- This is the CSS Reset ------- */ | |||||
| html, body, div, span, applet, object, iframe, | |||||
| h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, | |||||
| abbr, acronym, address, big, cite, code, del, | |||||
| dfn, em, img, ins, kbd, q, s, samp, small, | |||||
| strike, strong, sub, sup, tt, var, u, i, center, | |||||
| dl, dt, dd, ol, ul, li, fieldset, form, label, | |||||
| legend, table, caption, tbody, tfoot, thead, tr, | |||||
| th, td, article, aside, canvas, details, embed, | |||||
| figure, figcaption, footer, header, hgroup, menu, | |||||
| nav, output, ruby, section, summary, time, mark, audio, video { | |||||
| margin: 0; | |||||
| padding: 0; | |||||
| border: 0; | |||||
| font-size: 100%; | |||||
| font: inherit; | |||||
| vertical-align: baseline; | |||||
| } | |||||
| /* ------- HTML5 display-role reset for older browsers ------- */ | |||||
| article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { | |||||
| display: block; | |||||
| } | |||||
| body { | |||||
| line-height: 1; | |||||
| } | |||||
| ol, ul { | |||||
| list-style: none; | |||||
| } | |||||
| blockquote, q { | |||||
| quotes: none; | |||||
| } | |||||
| blockquote:before, blockquote:after, q:before, q:after { | |||||
| content: ''; | |||||
| content: none; | |||||
| } | |||||
| table { | |||||
| border-collapse: collapse; | |||||
| border-spacing: 0; | |||||
| } | |||||
| @@ -0,0 +1,187 @@ | |||||
| /* | |||||
| * | |||||
| * Template Name: Fullscreen Login | |||||
| * Description: Login Template with Fullscreen Background Slideshow | |||||
| * Author: Anli Zaimi | |||||
| * Author URI: http://azmind.com | |||||
| * | |||||
| */ | |||||
| body { | |||||
| background: #f8f8f8; | |||||
| font-family: 'PT Sans', Helvetica, Arial, sans-serif; | |||||
| text-align: center; | |||||
| color: #fff; | |||||
| } | |||||
| .page-container { | |||||
| margin: 120px auto 0 auto; | |||||
| } | |||||
| h1 { | |||||
| font-size: 30px; | |||||
| font-weight: 700; | |||||
| text-shadow: 0 1px 4px rgba(0,0,0,.2); | |||||
| } | |||||
| form { | |||||
| position: relative; | |||||
| width: 305px; | |||||
| margin: 15px auto 0 auto; | |||||
| text-align: center; | |||||
| } | |||||
| input { | |||||
| width: 270px; | |||||
| height: 42px; | |||||
| margin-top: 25px; | |||||
| padding: 0 15px; | |||||
| background: #2d2d2d; /* browsers that don't support rgba */ | |||||
| background: rgba(45,45,45,.15); | |||||
| -moz-border-radius: 6px; | |||||
| -webkit-border-radius: 6px; | |||||
| border-radius: 6px; | |||||
| border: 1px solid #3d3d3d; /* browsers that don't support rgba */ | |||||
| border: 1px solid rgba(255,255,255,.15); | |||||
| -moz-box-shadow: 0 2px 3px 0 rgba(0,0,0,.1) inset; | |||||
| -webkit-box-shadow: 0 2px 3px 0 rgba(0,0,0,.1) inset; | |||||
| box-shadow: 0 2px 3px 0 rgba(0,0,0,.1) inset; | |||||
| font-family: 'PT Sans', Helvetica, Arial, sans-serif; | |||||
| font-size: 14px; | |||||
| color: #fff; | |||||
| text-shadow: 0 1px 2px rgba(0,0,0,.1); | |||||
| -o-transition: all .2s; | |||||
| -moz-transition: all .2s; | |||||
| -webkit-transition: all .2s; | |||||
| -ms-transition: all .2s; | |||||
| } | |||||
| input:-moz-placeholder { color: #fff; } | |||||
| input:-ms-input-placeholder { color: #fff; } | |||||
| input::-webkit-input-placeholder { color: #fff; } | |||||
| input:focus { | |||||
| outline: none; | |||||
| -moz-box-shadow: | |||||
| 0 2px 3px 0 rgba(0,0,0,.1) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| -webkit-box-shadow: | |||||
| 0 2px 3px 0 rgba(0,0,0,.1) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| box-shadow: | |||||
| 0 2px 3px 0 rgba(0,0,0,.1) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| } | |||||
| button { | |||||
| cursor: pointer; | |||||
| width: 300px; | |||||
| height: 44px; | |||||
| margin-top: 25px; | |||||
| padding: 0; | |||||
| background: #ef4300; | |||||
| -moz-border-radius: 6px; | |||||
| -webkit-border-radius: 6px; | |||||
| border-radius: 6px; | |||||
| border: 1px solid #ff730e; | |||||
| -moz-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.25) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| -webkit-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.25) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.25) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| font-family: 'PT Sans', Helvetica, Arial, sans-serif; | |||||
| font-size: 14px; | |||||
| font-weight: 700; | |||||
| color: #fff; | |||||
| text-shadow: 0 1px 2px rgba(0,0,0,.1); | |||||
| -o-transition: all .2s; | |||||
| -moz-transition: all .2s; | |||||
| -webkit-transition: all .2s; | |||||
| -ms-transition: all .2s; | |||||
| } | |||||
| button:hover { | |||||
| -moz-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.15) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| -webkit-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.15) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.15) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| } | |||||
| button:active { | |||||
| -moz-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.15) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| -webkit-box-shadow: | |||||
| 0 15px 30px 0 rgba(255,255,255,.15) inset, | |||||
| 0 2px 7px 0 rgba(0,0,0,.2); | |||||
| box-shadow: | |||||
| 0 5px 8px 0 rgba(0,0,0,.1) inset, | |||||
| 0 1px 4px 0 rgba(0,0,0,.1); | |||||
| border: 0px solid #ef4300; | |||||
| } | |||||
| .error { | |||||
| display: none; | |||||
| position: absolute; | |||||
| top: 27px; | |||||
| right: -55px; | |||||
| width: 40px; | |||||
| height: 40px; | |||||
| background: #2d2d2d; /* browsers that don't support rgba */ | |||||
| background: rgba(45,45,45,.25); | |||||
| -moz-border-radius: 8px; | |||||
| -webkit-border-radius: 8px; | |||||
| border-radius: 8px; | |||||
| } | |||||
| .error span { | |||||
| display: inline-block; | |||||
| margin-left: 2px; | |||||
| font-size: 40px; | |||||
| font-weight: 700; | |||||
| line-height: 40px; | |||||
| text-shadow: 0 1px 2px rgba(0,0,0,.1); | |||||
| -o-transform: rotate(45deg); | |||||
| -moz-transform: rotate(45deg); | |||||
| -webkit-transform: rotate(45deg); | |||||
| -ms-transform: rotate(45deg); | |||||
| } | |||||
| .connect { | |||||
| width: 305px; | |||||
| margin: 35px auto 0 auto; | |||||
| font-size: 18px; | |||||
| font-weight: 700; | |||||
| text-shadow: 0 1px 3px rgba(0,0,0,.2); | |||||
| } | |||||
| .connect a { | |||||
| display: inline-block; | |||||
| width: 32px; | |||||
| height: 35px; | |||||
| margin-top: 15px; | |||||
| -o-transition: all .2s; | |||||
| -moz-transition: all .2s; | |||||
| -webkit-transition: all .2s; | |||||
| -ms-transition: all .2s; | |||||
| } | |||||
| .connect a.facebook { background: url(../image/facebook.png) center center no-repeat; } | |||||
| .connect a.twitter { background: url(../image/twitter.png) center center no-repeat; } | |||||
| .connect a:hover { background-position: center bottom; } | |||||
| @@ -0,0 +1,34 @@ | |||||
| /* | |||||
| Supersized - Fullscreen Slideshow jQuery Plugin | |||||
| Version : 3.2.7 | |||||
| Site : www.buildinternet.com/project/supersized | |||||
| Author : Sam Dunn | |||||
| Company : One Mighty Roar (www.onemightyroar.com) | |||||
| License : MIT License / GPL License | |||||
| */ | |||||
| * { margin:0; padding:0; } | |||||
| body { background:#111; height:100%; } | |||||
| img { border:none; } | |||||
| #supersized-loader { position:absolute; top:50%; left:50%; z-index:0; width:60px; height:60px; margin:-30px 0 0 -30px; text-indent:-999em; background:url(../image/progress.gif) no-repeat center center;} | |||||
| #supersized { display:block; position:fixed; left:0; top:0; overflow:hidden; z-index:-999; height:100%; width:100%; } | |||||
| #supersized img { width:auto; height:auto; position:relative; display:none; outline:none; border:none; } | |||||
| #supersized.speed img { -ms-interpolation-mode:nearest-neighbor; image-rendering: -moz-crisp-edges; } /*Speed*/ | |||||
| #supersized.quality img { -ms-interpolation-mode:bicubic; image-rendering: optimizeQuality; } /*Quality*/ | |||||
| #supersized li { display:block; list-style:none; z-index:-30; position:fixed; overflow:hidden; top:0; left:0; width:100%; height:100%; background:#111; } | |||||
| #supersized a { width:100%; height:100%; display:block; } | |||||
| #supersized li.prevslide { z-index:-20; } | |||||
| #supersized li.activeslide { z-index:-10; } | |||||
| #supersized li.image-loading { background:#111 url(../image/progress.gif) no-repeat center center; width:100%; height:100%; } | |||||
| #supersized li.image-loading img{ visibility:hidden; } | |||||
| #supersized li.prevslide img, #supersized li.activeslide img{ display:inline; } | |||||
| #supersized img { max-width: none !important } | |||||
| @@ -1,5 +1,6 @@ | |||||
| function openTerminal(options) { | function openTerminal(options) { | ||||
| //var CONNECT_TIME = 0; // 请求连接次数 | //var CONNECT_TIME = 0; // 请求连接次数 | ||||
| $("#form").hide(); | |||||
| Rows = parseInt(options.Rows); | Rows = parseInt(options.Rows); | ||||
| var client = new WSSHClient(); | var client = new WSSHClient(); | ||||
| var base64 = new Base64(); | var base64 = new Base64(); | ||||
| @@ -0,0 +1,30 @@ | |||||
| jQuery(function($){ | |||||
| $.supersized({ | |||||
| // Functionality | |||||
| slide_interval : 4000, // Length between transitions | |||||
| transition : 1, // 0-None, 1-Fade, 2-Slide Top, 3-Slide Right, 4-Slide Bottom, 5-Slide Left, 6-Carousel Right, 7-Carousel Left | |||||
| transition_speed : 1000, // Speed of transition | |||||
| performance : 1, // 0-Normal, 1-Hybrid speed/quality, 2-Optimizes image quality, 3-Optimizes transition speed // (Only works for Firefox/IE, not Webkit) | |||||
| // Size & Position | |||||
| min_width : 0, // Min width allowed (in pixels) | |||||
| min_height : 0, // Min height allowed (in pixels) | |||||
| vertical_center : 1, // Vertically center background | |||||
| horizontal_center : 1, // Horizontally center background | |||||
| fit_always : 0, // Image will never exceed browser width or height (Ignores min. dimensions) | |||||
| fit_portrait : 1, // Portrait images will not exceed browser height | |||||
| fit_landscape : 0, // Landscape images will not exceed browser width | |||||
| // Components | |||||
| slide_links : 'blank', // Individual links for each slide (Options: false, 'num', 'name', 'blank') | |||||
| slides : [ // Slideshow Images | |||||
| {image : '/static/image/backgrounds/1.jpg'}, | |||||
| {image : '/static/image/backgrounds/2.jpg'}, | |||||
| {image : '/static/image/backgrounds/3.jpg'} | |||||
| ] | |||||
| }); | |||||
| }); | |||||