简单的权限控制,密码使用sha加密
?
?
?
?
?
web.xml
?
?
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <!-- default: /WEB-INF/applicationContext.xml --> </listener> <!-- --> <!-- spring security --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:applicationContext*.xml </param-value> </context-param> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping></web-app>
?
applicationContext.xml
?
?
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <value>classpath:jdbc.properties</value> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- 配置事务管理器,注意这里的dataSource和SqlSessionFactoryBean的dataSource要一致,不然事务就没有作用了 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- myBatis文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis.xml" /> <property name="mapperLocations" value="classpath*:com/glen/model/*.xml" /> <property name="dataSource" ref="dataSource" /> </bean><!-- <bean id="accountDao" class="com.glen.dao.AccountDao"> <property name="sessionFactory" ref="sqlSessionFactory" /> </bean> <bean id="accountService" class="com.glen.service.AccountService"> <property name="accountDao" ref="accountDao" /> </bean> --> <context:annotation-config /> <context:component-scan base-package="com.glen" /></beans>
?
?
applicationContext-security.xml
?
?
?
?
<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> <!-- auto-config = true 则使用from-login. 如果不使用该属性 则默认为http-basic(没有session). access-denied-page:出错后跳转到的错误页面; --> <http auto-config="true" access-denied-page="/common/403.jsp"> <!-- intercept-url:拦截器,可以设定哪些路径需要哪些权限来访问. filters=none 不使用过滤,也可以理解为忽略 --> <intercept-url pattern="/index.jsp" access="ROLE_USER,ROLE_ADMIN" /> <intercept-url pattern="/login.jsp" filters="none" /> <intercept-url pattern="/common/**" filters="none" /> <intercept-url pattern="/script/**" filters="none" /> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" /> <intercept-url pattern="/user.jsp" access="ROLE_USER" /> <!-- session-management是针对session的管理. 这里可以不配置. 如有需求可以配置. --> <!-- id登陆唯一. 后登陆的账号会挤掉第一次登陆的账号 error-if-maximum-exceeded="true" 禁止2次登陆; session-fixation-protection="none" 防止伪造sessionid攻击. 用户登录成功后会销毁用户当前的session. 创建新的session,并把用户信息复制到新session中. --> <session-management session-fixation-protection="none"> <concurrency-control /> </session-management> <!-- login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面. default-target-url:成功登陆后跳转页面 --> <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp" default-target-url="/index.jsp" /> <!-- logout-success-url:成功注销后跳转到的页面; --> <logout logout-success-url="/login.jsp" /> <http-basic /> </http> <!-- 权限管理操作 --> <authentication-manager> <authentication-provider> <!-- 使用固定的用户名和密码及权限来做验证. --> <!-- <user-service> <user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="user" password="user" authorities="ROLE_USER" /> </user-service> --> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password,enabled from account where username=?" authorities-by-username-query="select username,authority from authorities where username=?" /> <password-encoder hash="sha"/> </authentication-provider> </authentication-manager> <!-- <beans:bean id="userDetailsServiceImpl" class="com.demo.test.service.impl.UserDetailsServiceImpl" /> --></beans:beans>
?
?
mybatis.xml?
?
?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>
?
struts.xml
?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="User" extends="json-default"> <action name="user" class="com.glen.action.AccountAction"> <result type="json" /> </action> </package> </struts>
?
account-mapper.xml
?
?
?
?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="account"> <!-- <select id="getList" parameterType="com.glen.model.Account" resultType="list" resultMap="accountMap.accountResultMap"> select * from account where username like '%' #{username} '%' </select> --> <select id="getAllAccount" resultType="list" resultMap="accountMap.accountResultMap"> select * from account </select> <!-- accountResultMap是account-resultmap.xml中定义的resultmap --> <select id="get" parameterType="com.glen.model.Account" resultType="com.glen.model.Account" resultMap="accountMap.accountResultMap"> <![CDATA[ select * from account where id = #{id} ]]> </select> <!-- 自动生成id策略 --> <insert id="add" useGeneratedKeys="true" keyProperty="id" parameterType="com.glen.model.Account"> insert into account(id, username, password) values(#{id,jdbcType=BIGINT}, #{username}, sha(#{password}))<!--将最后插入的逐渐返回到java对象--> <selectKey resultType="int" keyProperty="id"> SELECT LAST_INSERT_ID() </selectKey> </insert> <update id="edit" parameterType="com.glen.model.Account"> update account set username = #{username}, password = #{password} where id = #{id} </update> <delete id="remove" parameterType="com.glen.model.Account"> delete from account where id = #{id} </delete> </mapper>
?
account-resultMap.xml
?
?
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="accountMap"> <resultMap type="com.glen.model.Account" id="accountResultMap"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="enabled" column="enabled"/> </resultMap></mapper>
?Account.java
?
package com.glen.model;import java.io.Serializable;public class Account implements Serializable { private static final long serialVersionUID = -7970848646314840509L; private Integer id; private String username; private String password; private int enabled; public Account() { super(); } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getEnabled() { return enabled; } public void setEnabled(int enabled) { this.enabled = enabled; } }
?AccountDao.java
?
package com.glen.dao;import java.util.List;import javax.annotation.Resource;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.springframework.stereotype.Repository;import com.glen.model.Account;@Repositorypublic class AccountDao { @Resource private SqlSessionFactory sessionFactory; public SqlSessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SqlSessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public int insert(Account account) { SqlSession session = sessionFactory.openSession(); return session.insert("account.add", account); } public void remove(Account account) { SqlSession session = sessionFactory.openSession(); session.delete("account.remove", account); } public Account getAccountById(Account account) { SqlSession session = sessionFactory.openSession(); Account accountFromDb = (Account) session.selectOne("account.get", account); return accountFromDb; } @SuppressWarnings("unchecked") public List<Account> getAllAccount(){ SqlSession session = sessionFactory.openSession(); List<Account> accountFromDb = (List<Account>) session.selectList("account.getAllAccount"); return accountFromDb; }}
?
AccountService.java
?
package com.glen.service;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Repository;import com.glen.dao.AccountDao;import com.glen.model.Account;@Repositorypublic class AccountService { @Resource private AccountDao accountDao; public int insertAccount(Account account) { return accountDao.insert(account); } public int remove(String removeNumbers) { String arrs[] = removeNumbers.split("\\|"); for (String string : arrs) { System.out.println(string); Account account = new Account(); account.setId(Integer.parseInt(string)); accountDao.remove(account); } return arrs.length; } public Account getAccountById(Account account) { return accountDao.getAccountById(account); } public List<Account> getAllAccount() { return accountDao.getAllAccount(); } public AccountDao getAccountDao() { return accountDao; } public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } }
?
AccountAction.java
?
package com.glen.action;import java.io.IOException;import java.util.List;import javax.annotation.Resource;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;import org.apache.struts2.ServletActionContext;import org.springframework.stereotype.Component;import com.glen.model.Account;import com.glen.service.AccountService;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")@Componentpublic class AccountAction extends ActionSupport{ @Resource private AccountService accountService; private List<Account> list; private HttpServletResponse response ; private String removeNumbers; private Account account; private String level; @Override public String execute() throws Exception { // TODO Auto-generated method stub response = ServletActionContext.getResponse(); list = accountService.getAllAccount(); String jsonStr=""; for (Account account2 : list) { JSONObject jo = JSONObject.fromObject(account2); jsonStr+=","+ jo.toString(); } jsonStr = jsonStr.substring(1,jsonStr.length()); try { // 返回成功标识 response.getWriter().println(jsonStr); response.getWriter().flush(); System.out.println("haha"); } catch (IOException e) { e.printStackTrace(); } finally { try { response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public String addUser() throws Exception{ response = ServletActionContext.getResponse(); account.setEnabled(1); accountService.insertAccount(account); try { // 返回成功标识 response.getWriter().println("{success:true,userID:"+account.getId()+"}"); response.getWriter().flush(); System.out.println("haha"); } catch (IOException e) { e.printStackTrace(); } finally { try { response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public String removes(){ System.out.println(removeNumbers); response = ServletActionContext.getResponse(); int count = accountService.remove(removeNumbers); try { // 返回成功标识 response.getWriter().println(count); response.getWriter().flush(); System.out.println("haha"); } catch (IOException e) { e.printStackTrace(); } finally { try { response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } return null; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public AccountService getAccountService() { return accountService; } public void setAccountService(AccountService accountService) { this.accountService = accountService; } public List<Account> getList() { return list; } public void setList(List<Account> list) { this.list = list; } public Account getAccount() { return account; } public void setAccount(Account account) { this.account = account; } public String getRemoveNumbers() { return removeNumbers; } public void setRemoveNumbers(String removeNumbers) { this.removeNumbers = removeNumbers; } public String getLevel() { return level; } public void setLevel(String level) { this.level = level; }}
?login.js
?
/** * @author joo */Ext.require( [ 'Ext.form.*', 'Ext.window.*' ])Ext.onReady(function() { var form = Ext.create('Ext.form.Panel', { border : false, url : 'j_spring_security_check', method : 'post', fieldDefaults : { labelWidth : 50 }, bodyPadding : '30 60 10 60', items : [ { id:'loginUsername', xtype : 'textfield', fieldLabel : '用户名', name : 'j_username', anchor : '100%', shadow : true }, { xtype : 'textfield', id:'loginPassword', fieldLabel : '密码', name : 'j_password', anchor : '100%', padding : '20 0 0 0' } ] }) var win = Ext.create('Ext.window.Window', { title : 'Resize Me', width : 400, height : 200, layout : 'fit', x:500, y:200, plain : true, items : form, buttons : [ { text : '登陸', handler : function() { var username = Ext.getCmp('loginUsername').value; var password = Ext.getCmp('loginPassword').value; $('#bestLoginUsername').val(username); $('#bestLoginPassword').val(password); $('#submitForm').submit(); } }, { text : '取消' } ] }); win.show();});
?login.jsp
?
?
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'Login' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <link rel="stylesheet" type="text/css" href="ext-4.0/resources/css/ext-all.css" /> <link rel="stylesheet" type="text/css" href="ext-4.0/examples/shared/example.css" /> <script type="text/javascript" src="ext-4.0/bootstrap.js"></script> <script type="text/javascript" src="jquery-1.4.1.js"></script> <script type="text/javascript" src="login.js" charset="utf-8"></script> </head> <body> <div align="center" style="padding-top: 200px;padding-left:100px"> <form id="submitForm" action="<%=path %>/j_spring_security_check" method="post"> USERNAME:<input type="text" name="j_username" id="bestLoginUsername" value="" /><br/> PASSWORD:<input type="password" name="j_password" id="bestLoginPassword" value="" /><br/> </form> </div> </body></html>?
?
user.js
?
/** * @author joo */Ext.require([ 'Ext.dd.*', 'Ext.data.*', 'Ext.grid.*', 'Ext.ModelManager.*'])Ext.define('DataObject',{ extend:'Ext.data.Model', fields:['id','username','password']});function strToJson(str){ var json = eval('(' + str + ')'); return json; } var auth ;function getGrid(firstGridStore){ var Levelstates = Ext.create('Ext.data.Store', { fields: ['level', 'value'], data: [{ "level": "ROLE_USER", "value": "ROLE_USER" }, { "level": "ROLE_ADMIN", "value": "ROLE_ADMIN" } // ...] }); var columns = [ {text:'用户名',flex:1,sortable:true,dataIndex:'username'}, {text:'密码',winth:70,sortable:true,dataIndex:'password'} ] firstGrid = Ext.create('Ext.grid.Panel',{ multiSelect:true, viewConfig:{ plugins:{ ptype:'gridviewdragdrop', dragGroup:'firstGridDDGroup', dropGroup:'secondGridDDGroup' }, listeners: { drop: function(node, data, dropRec, dropPosition) { var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view'; Ext.example.msg("Drag from right to left", 'Dropped ' + data.records[0].get('name') + dropOn); } } }, store:firstGridStore, columns:columns, title:'用户列表', stripeRows:true, margins:'0 4 0 0' }) var secondGridStore = Ext.create('Ext.data.Store',{ model:DataObject }) secondGrid = Ext.create('Ext.grid.Panel',{ viewConfig:{ plugins:{ ptype:'gridviewdragdrop', dragGroup:'secondGridDDGroup', dropGroup:'firstGridDDGroup' }, listeners: { drop: function(node, data, dropRec, dropPosition) { var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view'; Ext.example.msg("Drag from left to right", 'Dropped ' + data.records[0].get('name') + dropOn); } } }, store:secondGridStore, stripeRows:true, columns:columns, title:'删除列表' }) var displayPanel = Ext.create('Ext.Panel',{ width:650, height:300, layout:{ type:'hbox', align:'stretch', padding:5 }, defaults:{flex:1}, items:[firstGrid,secondGrid], renderTo:'panel', dockedItems:{ xtype:'toolbar', dock:'bottom', items:[{ text:'添加', handler:function(){ if(auth=='[ROLE_ADMIN]') win.show(); if(auth=='[ROLE_USER]') Ext.Msg.alert('用户','您没有权限') } },'->',{ text:'删除', handler:function(){ if(auth=='[ROLE_USER]'){ Ext.Msg.alert('用户','您没有权限') return; } var store = (secondGrid.getStore()); if(store.getCount()<=0){ Ext.Msg.alert('消息', '请拖动数据到删除列表..'); return } var val = ""; for(var i=0;i<store.getCount();i++){ val += "|"+(store.getAt(i).get('id')) } val=val.substring(1, val.length); Ext.Ajax.request({ url: 'user!removes.action', success:function(response,opts){ Ext.Msg.alert('消息', '删除成功:共删除了'+response.responseText+'条内容'); secondGridStore.removeAll() }, failure:function(response,opts){ Ext.Msg.alert('消息', '删除失败'); }, params:{removeNumbers:val} }); //; } }] } }) var addUserForm = Ext.create('Ext.form.Panel',{ border:false, fieldDefaults:{ labelWidth:50 }, bodyPadding:'30 60 10 60', items:[{ xtype:'textfield', fieldLabel:'姓名', name:'account.username', anchor:'100%', shadow :true, id:'username', },{ xtype:'textfield', fieldLabel:'密碼', name:'account.password', anchor:'100%' , padding:'20 0 0 0', id:'password' } ] }) var win = Ext.create('Ext.window.Window', { title: 'Resize Me', width: 400, height:300, layout: 'fit', plain: true, items:addUserForm, buttons: [{ text: '添加', handler:function(){ var store = firstGrid.getStore(); //var loginForm = Ext.getCmp('login-form').form; addUserForm.form.doAction('submit', { url:'user!addUser.action', method:'POST', waitMsg:'正在添加...', timeout:10000,//10秒超时, //params:loginForm.getValues(), success:function(form, action){ //alert(action.result.userID); var user = Ext.ModelManager.create({ username : Ext.getCmp('username').value, password : Ext.getCmp('password').value, id : action.result.userID, }, 'DataObject'); store.insert(store.getCount(),user); }, failure:function(form, action){ alert('添加失败'); } }); win.hide(); } },{ text: '取消', handler:function(){ win.hide() } }] }); }Ext.onReady(function(){ //您的权限为 auth = $('#authHidden').val(); if(auth=='[ROLE_ADMIN]') Ext.Msg.alert('管理员','您的权限为管理员') if(auth=='[ROLE_USER]') Ext.Msg.alert('用户','您的权限为普通用户') Ext.Ajax.request({ url: 'user.action', success:function(response,opts){ var data = ('['+response.responseText+']'); var onepiece=strToJson(data); var firstGridStore = Ext.create('Ext.data.JsonStore',{ model:DataObject, data:onepiece }) getGrid(firstGridStore) }, failure:function(response,opts){ Ext.Msg.alert('消息', '错误'); }, params:{page:1} }); });
?index.jsp
?
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib prefix="s" uri="/struts-tags" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <link rel="stylesheet" type="text/css" href="ext-4.0/resources/css/ext-all.css" /> <link rel="stylesheet" type="text/css" href="ext-4.0/examples/shared/example.css" /> <script type="text/javascript" src="ext-4.0/bootstrap.js"></script> <script type="text/javascript" src="ext-4.0/examples/shared/examples.js"></script> <script type="text/javascript" src="user.js" charset="utf-8"></script> <script type="text/javascript" src="jquery-1.4.1.js"></script> <SCRIPT type="text/javascript"> </SCRIPT> <body> <INPUT type="hidden" id="authHidden" value ="<sec:authentication property="principal.authorities"/>"/> <div align="center" style="padding-top:120px;" id="panel"></div> </body></html>
1 楼 funnyone 2012-01-19