精华内容
下载资源
问答
  • Python学生管理系统(web网页版)

    热门讨论 2018-11-02 11:28:27
    Python学生管理系统(web网页版),前面发布了python的控制台版本的学生管理系统和使用tkinter界面版的学生管理系统,这次是使用Django开发基于学生的实体类的增删改查,里面包含项目演示录屏和完整的项目源码与...
  • web前端网页模板.zip

    2019-06-10 16:31:59
    web前端网页模板,很好用的web前端js模板,有登录页面,权限管理页面
  • web管理登录页面

    万次阅读 2018-08-10 14:42:23
    配置xml文件 &...web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jc

    配置xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
      <error-page>
        <error-code>404</error-code>
        <location>/404.jsp</location>
      </error-page>
      <error-page>
        <error-code>500</error-code>
        <location>/500.jsp</location>
      </error-page>
    </web-app>

    404以及500页面并没有写出,只是给用户一个提醒而已。

    登录页面:login.jsp

    加入图片验证码,登录页面框

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    
    	<script type="text/javascript">
    		function changeCode(){
    			//得到图片元素
    			var img = document.getElementsByTagName("img")[0];
    			img.src = "${pageContext.request.contextPath}/validateCode?time="+new Date().getTime();
    		}
    	</script>
    </head>
    <body>
    	${info }<br>
    	${loginInfo }
    	<form action= "${pageContext.request.contextPath }/login" method="post">
    		 账号:<input type="text" name="email" placeholder="请输入邮箱"><br>
    		 密码: <input type="password" name="password" placeholder="请输入密码"><br>
    		验证码:<input type="text" name="code" placeholder="${msg }" />
    	<img src="${pageContext.request.contextPath}/validateCode" onclick="changeCode()"/><a href="javascript:changeCode()" >看不清换一张</a><br>
    		<input type="submit" value="登录"/><br>
    	</form>
    	
    
    </body>
    </html>

    进入后的页面:index.jsp

    内容包含:查看所有用户和添加用户及联系吧主

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    	欢迎:${userName }<br>
    
    <a href="${pageContext.request.contextPath }/user/list">查看所有的用户</a> <br>
    <a href="${pageContext.request.contextPath }/useradd.jsp">添加用户</a>
    
    <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=1539399310&site=qq&menu=yes"><img border="0" src="http://wpa.qq.com/pa?p=2:1539399310:53" alt="点击这里给我发消息" title="点击这里给我发消息"/></a></body>
    </html>

    添加、删除、修改用户等总跳转:user.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<a href="user/add">useradd</a><br>
    	<a href="user/update">update</a><br>
    	<a href="user/delete">delete</a><br>
    	<a href="user/list">list</a><br>
    	
    	
    </body>
    </html>

    添加用户页面:useradd.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!--  request.getParameter("username") 如果用户不填信息的话 获取的值为null值  null值是可以进行==判断的   -->
    ${msg }
    	<form action="user/add" method="post">
    		用户:<input type="text" name="username" value="<%= request.getParameter("username")==null ?"":request.getParameter("username") %>"><br>
    		邮箱:<input type="text" name="email" value="<%= request.getParameter("email")==null ?"":request.getParameter("email")%>"><br>
    		密码:<input type="password" name="password"><br>
    		确认密码:<input type="password" name="confirmpwd"><br>
    		<input type="submit" value="提交">
    	</form>
    </body>
    </html>

    修改用户页面:userupdate.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="update" method="post">
    		<!-- disable 属性设置的域无法传到request请求域中   -->
    		<input type="hidden" name="id" readonly="readonly" value="${user.id }" ><br>
    		用户名:<input type="text" name="username" value="${user.username }"><br>
    		邮箱:<input type="text" name="email" value="${user.email }"><br>
    		密码:<input type="password" name="password" value="${user.password }"><br>
    		<button type="submit">提交</button>
    	
    	</form>
    </body>
    </html>

    所有用户显示页面:userlist.jsp

    包含修改 删除用户,上下一页等。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	
    	<c:choose>
    		<c:when test="${!empty pageUser.userList }">
    				<table border="1" cellpadding="0" cellspacing="0">
    					<tr>
    						<th>用户ID</th>
    						<th>用户姓名</th>
    						<th>用户邮箱</th>
    						<th colspan="2">编辑</th>
    					</tr>
    					
    					<c:forEach items="${pageUser.userList }" var="user" >
    						<tr>
    							<td>${user.id }</td>
    							<td>${user.username }</td>
    							<td>${user.email }</td>
    							<td>
    							<a href="${pageContext.request.contextPath }/user/preUpdate?id=${user.id}">
    								修改
    								</a>
    							</td>
    							<td>
    								<a href="${pageContext.request.contextPath }/user/delete?id=${user.id}">	
    									删除
    								</a>
    							 </td>
    						</tr>
    					</c:forEach>
    				</table>
    				<a href="${pageContext.request.contextPath }/page?currentPage=${pageUser.currentPage==1 ? 1:pageUser.currentPage-1}">上一页<< </a>
    					当前页${pageUser.currentPage }/共${pageUser.totalPage }页
    				<a href="${pageContext.request.contextPath }/page?currentPage=${pageUser.currentPage == pageUser.totalPage ? pageUser.totalPage : pageUser.currentPage+1}"> >>下一页</a>
    		</c:when>
    		<c:when test="${empty userlist }">
    			没有用户信息  
    			<a href="index.jsp">返回首页</a>
    		</c:when>
    	</c:choose>
    	
    	
    </body>
    </html>

    利用枚举将每页显示数据条数列出(这里默认设置的四条):pageenum.java

    package com.javaweb.costant;
    
    public enum PageEnum {
    
    	PageSize;
    	
    	//每页的默认大小 
    	public int size;
    	
    	PageEnum(int size){
    		this.size = size;
    	}
    	
    	private PageEnum() {
    		this(4);
    	}
    
    	public int getSize() {
    		return size;
    	}
    
    	public void setSize(int size) {
    		this.size = size;
    	}
    	
    	
    	
    }

    获取总记录数及获取当前页数据:pagedao.java

    package com.javaweb.dao;
    
    import java.sql.SQLException;
    import java.util.List;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import com.javaweb.entity.User;
    import com.javaweb.util.DruidUtil;
    
    public class PageDao {
    
    	static QueryRunner queryRunner;
    	static{
    		//dataSource 在容器启动的时候 进行的初始化 
    		 queryRunner = new QueryRunner(DruidUtil.dataSource);
    	}
    	//获取总的记录数
    	public long getToalSize(){
    		try {
    			ScalarHandler<Long> scalarHandler = new ScalarHandler<>();
    			long i = (long) queryRunner.query("select count(*) from user",scalarHandler);
    			return i;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return 0;
    	}
    	//获取当前页的数据 
    	public List<User> getCurrentPage(int currentPage,int pageSize){
    		try {
    			BeanListHandler<User> beanListHandler = new BeanListHandler<>(User.class);
    			List<List<User>> result = queryRunner.execute("select * from user limit ?,?",beanListHandler,(currentPage-1)*pageSize,pageSize );
    			return result.get(0);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	
    }

    userdao.java

    package com.javaweb.dao;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import com.javaweb.entity.User;
    import com.javaweb.util.DruidUtil;
    
    /**
     * 数据访问 层
     * @author Administrator
     *
     */
    public class UserDao {
    	
    	static QueryRunner queryRunner;
    	static{
    		//dataSource 在容器启动的时候 进行的初始化 
    		 queryRunner = new QueryRunner(DruidUtil.dataSource);
    	}
    
    	public User getUserByEmail(String email){
    		List<User> result;
    		try {
    			result = queryRunner.execute("select * from user where email =?", new BeanHandler<>(User.class),email);
    			return result.get(0);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	public boolean deleteUser(int id){
    		try {
    			int i = queryRunner.update("delete from user where id = ? ",id);
    			if(i > 0){
    				return true;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    	
    	public boolean updateUser(String username,String email,String password,int id){
    		int update;
    		try {
    			update = queryRunner.execute("update user set username = ?,email = ?,password = ? where id = ? ",username,email,password,id);
    			if(update>0){
    				return true;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    	
    	public User getUserById(int id){
    		List<User> result;
    		try {
    			result = queryRunner.execute("select * from user where id =?", new BeanHandler<>(User.class),id);
    			return result.get(0);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	public boolean addUser(String username,String email,String password){
    		int update;
    		try {
    			update = queryRunner.execute("insert into user(username,email,password) values(?,?,?)",username,email,password);
    			if(update > 0){
    				return true;
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return false;
    		}
    		return false;
    		
    	}
    	
    	public boolean deleteUserById(int id){
    		
    		try {
    			int update = queryRunner.update("delete from user where id = ? ",id);
    			if(update>0){
    				return true;
    			}
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return false;
    		}finally {		
    			//TODO QueryRunner 除了数据源 其他自己处理 
    		}
    		return false;
    	}
    	
    	public List<User>  getAllUserByApache(){
    		// 用于处理实体bean的结果集
    		BeanListHandler<User> beanListHandler = new BeanListHandler<>(User.class);
    		List<List<User>> execute=null;
    		
    		try {
    			execute = queryRunner.execute("select * from user",beanListHandler);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		//queryRunner.execute("select * from user", new BeanListHandler<>(User.class));
    		return execute.get(0);
    	}
    	
    	public List<User> getAllUser(){
    		Connection connection = DruidUtil.getConnection();
    		List<User> userList = new ArrayList<>();
    		PreparedStatement prepareStatement=null;
    		ResultSet resultSet=null;
    		try {
    			 prepareStatement = connection.prepareStatement("select * from user");
    			 resultSet = prepareStatement.executeQuery();
    			while(resultSet.next()){
    				//一条记录 对应一个User对象; 有几条记录 new 几个user实例
    				User user = new User();
    				user.setId(resultSet.getInt("id"));
    				user.setUsername("java12="+resultSet.getString("username"));
    				user.setEmail(resultSet.getString("email"));
    				userList.add(user);
    			}
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}finally{
    			DruidUtil.close(null, connection, prepareStatement, resultSet);
    		}
    		return userList;
    	}
    }
    

    实例定义:pagebean.java及user.java

    package com.javaweb.entity;
    
    import java.util.List;
    
    public class PageBean {
    
    	//总的页数
    	private Integer totalPage;
    	//当前页
    	private Integer currentPage;
    	//每页的数据 
    	private List<User> userList;
    	
    	
    	public Integer getTotalPage() {
    		return totalPage;
    	}
    	public void setTotalPage(Integer totalPage) {
    		this.totalPage = totalPage;
    	}
    	public Integer getCurrentPage() {
    		return currentPage;
    	}
    	public void setCurrentPage(Integer currentPage) {
    		this.currentPage = currentPage;
    	}
    	public List<User> getUserList() {
    		return userList;
    	}
    	public void setUserList(List<User> userList) {
    		this.userList = userList;
    	}
    	@Override
    	public String toString() {
    		return "PageBean [totalPage=" + totalPage + ", currentPage=" + currentPage + ", userList=" + userList + "]";
    	}
    	
    	
    	
    }
    
    package com.javaweb.entity;
    
    public class User {
    
    	private Integer id;
    	private String username;
    	private String password;
    	private String email;
    	private Address address;
    	public User(Integer id, String username, String password, String email) {
    		super();
    		this.id = id;
    		this.username = username;
    		this.password = password;
    		this.email = email;
    	}
    	public User() {
    		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 String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	
    	@Override
    	public String toString() {
    		return "User [id=" + id + ", nausername=" + username + ", password=" + password + ", email=" + email + "]";
    	}
    	
    	
    }
    

    加入过滤器使页面可以显示或者添加中文:encodefilter.java

    package com.javaweb.filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @WebFilter("/*")
    public class EncodeFilter implements Filter {
    
    	
        public EncodeFilter() {
        }
    
    	public void destroy() {
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		response.setCharacterEncoding("utf-8");
    		chain.doFilter(request, response);
    	}
    
    	public void init(FilterConfig fConfig) throws ServletException {
    	}
    
    }

    登录页面过滤器:loginfilter.java

    package com.javaweb.filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @WebFilter("/*")
    public class LoginFilter implements Filter {
    
    	Logger logger = LoggerFactory.getLogger(LoginFilter.class);
    	
        public LoginFilter() {
        }
    
    	public void destroy() {
    	}
    
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		HttpServletRequest httpServletRequest = (HttpServletRequest)request;
    		HttpServletResponse httpServletResponse = (HttpServletResponse)response;
    		String requestURI = httpServletRequest.getRequestURI();
    		//对login.jsp 和生成验证码的servlet 进行放行 其他请求过滤 
    		if(!requestURI.contains("login") && !requestURI.contains("validateCode")){
    			//判断session是否用用户登陆的信息
    			String userName =(String)httpServletRequest.getSession().getAttribute("userName");
    			if(logger.isInfoEnabled()){
    				logger.info("session中的用户为:{}",userName);
    			}
    			if(userName==null){
    				httpServletRequest.setAttribute("loginInfo", "请登陆");
    				httpServletRequest.getRequestDispatcher("/login.jsp").forward(httpServletRequest, httpServletResponse);
    				//httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
    			}else{
    				chain.doFilter(httpServletRequest, httpServletResponse);
    			}
    		}else{
    			chain.doFilter(request, response);
    		}
    	}
    
    	/**
    	 * @see Filter#init(FilterConfig)
    	 */
    	public void init(FilterConfig fConfig) throws ServletException {
    		// TODO Auto-generated method stub
    	}
    
    }
    

    监听器:contextlistener.java

    package com.javaweb.listener;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.javaweb.util.DruidUtil;
    
    @WebListener
    public class ContextListener implements ServletContextListener {
    
    	Logger logger = LoggerFactory.getLogger(ContextListener.class);
    	
        public ContextListener() {
        }
    
        public void contextDestroyed(ServletContextEvent sce)  { 
        	DruidUtil.closeDataSource();
        	if(logger.isInfoEnabled()){
        		logger.info("数据源关闭了");
        	}
        }
    
        //Tomcat容器启动的时候调用  用于初始化数据源
        public void contextInitialized(ServletContextEvent sce)  { 
        	try {
        		Class.forName("com.javaweb.util.DruidUtil");
        		if(logger.isInfoEnabled()){
        			logger.info("数据源初始化完成");
        		}
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
        }
    	
    }

    页面服务:pageservice.java

    package com.javaweb.service;
    
    import java.util.List;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.javaweb.costant.PageEnum;
    import com.javaweb.dao.PageDao;
    import com.javaweb.entity.PageBean;
    import com.javaweb.entity.User;
    import com.javaweb.servlet.PageServlet;
    
    public class PageService {
    	
    	Logger logger = LoggerFactory.getLogger(PageService.class);
    	
    	public PageBean getPageBean(String currentPage){
    		
    		if(logger.isInfoEnabled()){
    			logger.info("获取的当前页为:{}",currentPage);
    		}
    		Integer currentPageInteger = 0;
    		if(currentPage!=null){
    			currentPageInteger = Integer.valueOf(currentPage);
    		}
    		
    		PageDao pageDao = new PageDao();
    		//总记录数
    		long totalSize = pageDao.getToalSize();
    		if(logger.isInfoEnabled()){
    			logger.info("获取的总记录数为:{}",totalSize);
    		}
    		//总的页码
    		int totalPage = (int) (totalSize % PageEnum.PageSize.size == 0 ? totalSize / PageEnum.PageSize.size : (totalSize / PageEnum.PageSize.size) +1); 
    		//int totalPage = (int)Math.ceil(totalSize / PageEnum.PageSize.size)+1;
    		if(logger.isInfoEnabled()){
    			logger.info("获取的总页数为:{}",totalPage);
    		}
    		//当前页的数据
    		List<User> currentPageUser = pageDao.getCurrentPage(currentPageInteger, PageEnum.PageSize.size);
    		if(logger.isInfoEnabled()){
    			logger.info("获取的当前页的数据为:{}",currentPageUser);
    		}
    		PageBean pageBean = new PageBean();
    		pageBean.setCurrentPage(currentPageInteger);
    		pageBean.setTotalPage(totalPage);
    		pageBean.setUserList(currentPageUser);
    		
    		if(logger.isInfoEnabled()){
    			logger.info("返回到当前页的数据为:{}",pageBean);
    		}
    		
    		return pageBean;
    		
    	}
    	
    }
    

    登录验证页面:loginservlet.java

    package com.javaweb.servlet;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.tomcat.util.buf.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.javaweb.dao.UserDao;
    import com.javaweb.entity.User;
    import com.javaweb.util.PasswordUtil;
    
    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
        
    	Logger logger = LoggerFactory.getLogger(LoginServlet.class);
    	
        public LoginServlet() {
            super();
        }
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String code = request.getParameter("code");
    		String email = request.getParameter("email");
    		String password = request.getParameter("password");
    		String sessionCode = (String)request.getSession().getAttribute("sessioncode");
    		if(logger.isInfoEnabled()){
    			logger.info("页面传过来的code为:{}。session中的验证码为:{}",code,sessionCode);
    		}
    		//为什么将sessionCode放在前面这个问题
    		/* 如果从页面中获取的code为null的话 也就是用户没有输入(加入前端没有提示) 此时将报NullPointerExcepiton
    		if(code.equals(sessionCode)){}
    		*/
    		//①首先判断验证码 因为邮箱密码的时候 需要进行数据库的查询 这样减少与数据库的交互 省了查询的时间
    		if(!sessionCode.equalsIgnoreCase(code)){
    			request.setAttribute("msg", "验证码不一致 请重新输入");
    			request.getRequestDispatcher("login.jsp").forward(request, response);
    		}else{
    			if(logger.isInfoEnabled()){
    				logger.info("获取到的账号邮箱为:{},密码为:{}",email,password);
    			}
    			//② 验证码 正确 开始进行数据库的查询 进行校验密码
    			UserDao userDao = new UserDao();
    			User userByEmail = userDao.getUserByEmail(email);
    			if(logger.isInfoEnabled()){
    				logger.info("查询出来的用户为:{}",userByEmail);
    			}
    			//③ 从数据库中查询出来的用户不存在  
    			if(userByEmail == null){
    				request.setAttribute("info", "用户账号不存在");
    				request.getRequestDispatcher("login.jsp").forward(request, response);
    			}else{
    				//④ 存在情况 开始加密密码值的比对 因为用户输入的是明文 数据库保存的是密文
    				//对用户输入的明文密码进行加密
    				String secPassword = PasswordUtil.createPassword(password);
    				//使用加密后的密码和数据库中的密码进行比对
    				if(!userByEmail.getPassword().equals(secPassword)){
    					request.setAttribute("info", "密码错误");
    					request.getRequestDispatcher("login.jsp").forward(request, response);
    				}else{
    					//登陆完成 在session中存放用户名
    					HttpSession session = request.getSession();
    					session.setAttribute("userName", userByEmail.getUsername());
    					
    					session.setMaxInactiveInterval(60*1);
    					response.sendRedirect("index.jsp");
    				}
    			}
    			
    		}
    		
    		
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    页面页码:pageservlet.java

    package com.javaweb.servlet;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.javaweb.costant.PageEnum;
    import com.javaweb.entity.PageBean;
    import com.javaweb.entity.User;
    import com.javaweb.service.PageService;
    
    @WebServlet("/page")
    public class PageServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
    	Logger logger = LoggerFactory.getLogger(PageServlet.class);
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//需要从页面获取当前页   如果是第一次进入查看的话 currentpage 是没有值的  设置默认值为第一页
    		String currentPage = request.getParameter("currentPage") != null ? request.getParameter("currentPage") : "1";
    		
    		
    		PageService pageService = new PageService();
    		PageBean pageBean = pageService.getPageBean(currentPage);
    		
    		
    		request.setAttribute("pageUser", pageBean);
    		request.getRequestDispatcher("/userlist.jsp").forward(request, response);
    		
    		
    	}
    	
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    * 主要  删除添加修改用户信息:userservlet.java

    package com.javaweb.servlet;
    
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.beanutils.BeanUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.javaweb.dao.UserDao;
    import com.javaweb.entity.PageBean;
    import com.javaweb.entity.User;
    import com.javaweb.service.PageService;
    import com.javaweb.util.PasswordUtil;
    
    @WebServlet("/user/*")
    public class UserServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	Logger logger = LoggerFactory.getLogger(UserServlet.class);
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		String requestURI = request.getRequestURI();
    		if (logger.isInfoEnabled()) {
    			logger.info("获取到的URI为:{}", requestURI);
    		}
    		//eg:"/javaweb_crud_v3/user/list" => "","javaweb_crud-v3","user","list" 
    		String[] splitURI = requestURI.split("/");
    		if (logger.isInfoEnabled()) {
    			logger.info("截取到的URI中包含的操作为为:{}", splitURI[3]);
    		}
    		switch (splitURI[3]) {
    		case "add":
    			addUser(request,response);
    			break;
    		case "delete":
    			deleteUser(request,response);
    			break;
    		// 预修改 用于回显修改的数据
    		case "preUpdate":
    			preUpdateUser(request,response);
    			break;
    		// 提交修改的操作
    		case "update":
    			updateUser(request,response);
    			break;
    		case "list":
    			listUser(request, response);
    			break;
    		// 没有该请求路径的时候	
    		default:
    			nonSuchUrl(request,response);
    			break;
    		}
    
    	}
    
    	
    	private void nonSuchUrl(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		response.getWriter().print("请检查你的路径");
    	}
    
    	private void addUser(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		//从页面中获取体积的参数 这些参数 是可以通过转发 到某一个页面 再重新获取的(<%request.getParameter("") %>)
    				//如果想通过EL表达式获取的话 需要使用request.setAttribute("","");
    				
    				//参数域过多的情况 需要对属性一个一个的set值操作  过程繁琐 需要封装 用Apache提供的工具类
    				String username = request.getParameter("username");
    				String email = request.getParameter("email");
    				String password = request.getParameter("password");
    				String confirmpwd = request.getParameter("confirmpwd");
    				
    				//================================================
    				//参数域过多的情况下 使用Apache工具类 进行属性域的填充
    				User user = new User();
    				try {
    					//Apache 工具类 直接对对象进行渲染
    					BeanUtils.populate(user, request.getParameterMap());
    					if(logger.isInfoEnabled()){
    						logger.info("获取的所有参数域为:{}",request.getParameterMap());
    					}
    					if(logger.isInfoEnabled()){
    						logger.info("封装的用户对象为:{}",user);
    					}
    				} catch (IllegalAccessException e) {
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					e.printStackTrace();
    				}
    				//=================================================
    				
    				//进行日志输出 查看获取的参数 
    				if(logger.isInfoEnabled()){
    					logger.info("获取到的用户名为:{},邮箱为:{}",username,email);
    				}
    				//两次密码不一致 需要重新添加
    				if(password.equals(confirmpwd)){
    					//需不需要对username email password..... 进行对象的封装
    					//如果需要的话 该如何处理??????
    					UserDao userDao = new UserDao();
    					String createPassword = PasswordUtil.createPassword(password);
    					boolean addFlag = userDao.addUser(username, email, createPassword);
    					//添加成功 重定向到查询页面 简单粗暴有效 
    					//显示一个页面 告诉你3秒后跳转 or 直接跳转??????
    					if(addFlag){
    						//简单的模拟
    						response.getWriter().println("用户添加成功,3秒后跳转");
    						response.setHeader("refresh", "3;url="+request.getContextPath()+"/user/list");
    						//response.sendRedirect("listusers");
    					}else{
    						//添加失败 得用转发 用于回显用户填写的信息 用户只需要修改错误的信息字段即可 其他不需要修改 也不需要重新填写
    						request.getRequestDispatcher("/useradd.jsp").forward(request, response);
    					}
    				}else{
    					//setAttribute这种形式 是可以使用EL表达式 进行获取值的 
    					request.setAttribute("msg", "两次密码不一致");
    					request.getRequestDispatcher("/useradd.jsp").forward(request, response);
    				}
    		
    	}
    
    	private void updateUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		String id = request.getParameter("id");
    		String username = request.getParameter("username");
    		String email = request.getParameter("email");
    		String password = request.getParameter("password");
    		if(logger.isInfoEnabled()){
    			logger.info("要修改的数据为:用户ID{},用户名{},邮箱{}",id,username,email);
    		}
    		//对修改的密码进行加密
    		String createPassword = PasswordUtil.createPassword(password);
    		UserDao userDao = new UserDao();
    		boolean updateFlag = userDao.updateUser(username, email, createPassword, Integer.valueOf(id));
    		if(updateFlag){
    			response.sendRedirect(request.getContextPath()+"/user/list");
    		}
    		
    	}
    
    	private void deleteUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
    		String id = request.getParameter("id");
    		UserDao userDao = new UserDao();
    		boolean deleteFlag = userDao.deleteUser(Integer.valueOf(id));
    		if(logger.isInfoEnabled()){
    			logger.info("删除用户ID为{}的用户",id);
    		}
    		if(deleteFlag){
    			response.sendRedirect(request.getContextPath()+"/user/list");
    		}
    	}
    
    	private void preUpdateUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String id = request.getParameter("id");
    		Integer integer = Integer.valueOf(id);
    		
    		//根据用户ID来查找该用户
    		UserDao userDao = new UserDao();
    		User user = userDao.getUserById(integer);
    		if(logger.isInfoEnabled()){
    			logger.info("查找出来的用户为:{}",user);
    		}
    		if(user!=null){
    			request.setAttribute("user", user);
    			request.getRequestDispatcher("/userupdate.jsp").forward(request, response);
    		}
    		
    	}
    
    	private void listUser(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		//需要从页面获取当前页   如果是第一次进入查看的话 currentpage 是没有值的  设置默认值为第一页
    		String currentPage = request.getParameter("currentPage") != null ? request.getParameter("currentPage") : "1";
    		
    		
    		PageService pageService = new PageService();
    		PageBean pageBean = pageService.getPageBean(currentPage);
    		
    		
    		request.setAttribute("pageUser", pageBean);
    		request.getRequestDispatcher("/userlist.jsp").forward(request, response);
    		
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    生成验证码:validatecodeservlet.java

    package com.javaweb.servlet;
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.dsna.util.images.ValidateCode;
    
    @WebServlet("/validateCode")
    public class ValidateCodeServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	public ValidateCodeServlet() {
    		super();
    	}
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// 告诉客户端不使用缓存
    		response.setHeader("pragma", "no-cache");
    		response.setHeader("cache-control", "no-cache");
    		response.setIntHeader("expires", 0);
    
    		ValidateCode vc = new ValidateCode(110, 25, 4, 9);
    		
    		String code = vc.getCode();// 得到生成的字符
    		//将验证码存放到session中
    		request.getSession().setAttribute("sessioncode", code);
    		
    		vc.write(response.getOutputStream());
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }

    druid连接池链接数据库:druidutil.java

    package com.javaweb.util;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    public class DruidUtil {
    
    	// 避免DataSource 数据源创建多次 
    	// 在类加载的时候即初始化一次
    	static Properties properties;
    	public static DataSource dataSource;
    	
    	static{
    		properties = new Properties();
    		try {
    			properties.load(DruidUtil.class.getClassLoader().getResourceAsStream("alibaba.properties"));
    			getDataSource();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static void closeDataSource(){
    		DruidDataSource druidDataSource=(DruidDataSource)dataSource;
    		druidDataSource.close();
    	}
    	
    	public static DataSource getDataSource(){
    		try {
    			 dataSource = DruidDataSourceFactory.createDataSource(properties);
    			return dataSource;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	public static Connection getConnection(){
    		try {
    			Connection connection = dataSource.getConnection();
    			return connection;
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	
    	public static void close(DataSource dataSource,Connection conn,PreparedStatement preparedStatement,ResultSet resultSet){
    		
    		if(resultSet!=null){
    			try {
    				resultSet.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(preparedStatement!=null){
    			try {
    				preparedStatement.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(conn!=null){
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		if(dataSource!=null){
    			DruidDataSource source=(DruidDataSource)dataSource;
    			source.close();
    		}
    		
    	}
    	public static void main(String[] args) throws SQLException {
    		DruidDataSource dataSource = (DruidDataSource)DruidUtil.getDataSource();
    		System.out.println(dataSource.getConnection());
    		DruidDataSource dataSource2 = (DruidDataSource)DruidUtil.getDataSource();
    		System.out.println(dataSource2.getConnection());
    	}
    	
    }
    

    密码加密:passwordutil.java

    package com.javaweb.util;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    
    public class PasswordUtil {
    	// 16进制下数字到字符的映射数组
    	private static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
    			"d", "e", "f" };
    
    	// 将inputstr加密
    	public static String createPassword(String inputstr) {
    		return encodeByMD5(inputstr);
    	}
    
    	// 验证密码是否正确
    	public static boolean authenticatePassword(String pass, String inputstr) {
    		if (pass.equals((encodeByMD5(inputstr)))) {
    			return true;
    		} else {
    			return false;
    		}
    	}
    
    	// 对字符串进行MD5编码
    	private static String encodeByMD5(String originstr) {
    		if (originstr != null) {
    			try {
    				// 创建具有指定算法名称的信息摘要
    				MessageDigest md = MessageDigest.getInstance("MD5");
    				// 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算
    				byte[] results = md.digest(originstr.getBytes());
    				// 将得到的字节数组编程字符窜返回
    				String resultString = byteArrayToHexString(results);
    				return resultString.toUpperCase();
    			} catch (Exception ex) {
    				ex.printStackTrace();
    			}
    		}
    		return null;
    	}
    
    	// 转换字节数组为十六进制字符串
    	private static String byteArrayToHexString(byte[] b) {
    		StringBuffer resultsb = new StringBuffer();
    		int i = 0;
    		for (i = 0; i < b.length; i++) {
    			resultsb.append(byteToHexString(b[i]));
    		}
    		return resultsb.toString();
    	}
    
    	// 将字节转化成十六进制的字符串
    	private static String byteToHexString(byte b) {
    		int n = b;
    		if (n < 0) {
    			n = 256 + n;
    		}
    		int d1 = n / 16;
    		int d2 = n / 16;
    		return hexDigits[d1] + hexDigits[d2];
    	}
    	
    	/**
    	 * @param decript 要加密的字符串
    	 * @return 加密的字符串
    	 * SHA1加密
    	 */
    	public final static String SHA1(String decript) {
    	    try {
    	        MessageDigest digest = java.security.MessageDigest
    	                .getInstance("SHA-1");
    	        digest.update(decript.getBytes());
    	        byte messageDigest[] = digest.digest();
    	        // Create Hex String
    	        StringBuffer hexString = new StringBuffer();
    	        // 字节数组转换为 十六进制 数
    	        for (int i = 0; i < messageDigest.length; i++) {
    	            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
    	            if (shaHex.length() < 2) {
    	                hexString.append(0);
    	            }
    	            hexString.append(shaHex);
    	        }
    	        return hexString.toString();
    
    	    } catch (NoSuchAlgorithmException e) {
    	        e.printStackTrace();
    	    }
    	    return "";
    	}
    
    	
    
    	public static void main(String[] args) {
    		String password = PasswordUtil.createPassword("123456");
    		System.out.println("对123456用MD5加密后:" + password);
    		String inputstr = "1234";
    		System.out.println("1234与密码相同?" + PasswordUtil.authenticatePassword(password, inputstr));
    		inputstr = "123456";
    		System.out.println("123456与密码相同?" + PasswordUtil.authenticatePassword(password, inputstr));
    	}
    }

    代码中用到的两个properties文件:alibaba、simplelogger

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/javaweb?useSSL=false
    username=root
    password=980916
    filters=stat
    initialSize=21
    maxActive=300
    maxWait=60000
    timeBetweenEvictionRunsMillis=60000
    minEvictableIdleTimeMillis=300000
    validationQuery=SELECT 1
    testWhileIdle=true
    testOnBorrow=false
    testOnReturn=false
    poolPreparedStatements=false
    maxPoolPreparedStatementPerConnectionSize=200
    # SLF4J's SimpleLogger configuration file
    # Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
    
    # Default logging detail level for all instances of SimpleLogger.
    # Must be one of ("trace", "debug", "info", "warn", or "error").
    # If not specified, defaults to "info".
    org.slf4j.simpleLogger.defaultLogLevel=info
    # 指定文件输出的方向
    org.slf4j.simpleLogger.logFile = System.out
    # Logging detail level for a SimpleLogger instance named "xxxxx".
    # Must be one of ("trace", "debug", "info", "warn", or "error").
    # If not specified, the default logging detail level is used.
    #org.slf4j.simpleLogger.log.xxxxx=
    
    # Set to true if you want the current date and time to be included in output messages.
    # Default is false, and will output the number of milliseconds elapsed since startup.
    #org.slf4j.simpleLogger.showDateTime=false
    
    # The date and time format to be used in the output messages.
    # The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
    # If the format is not specified or is invalid, the default format is used.
    # The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
    #org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
    
    # Set to true if you want to output the current thread name.
    # Defaults to true.
    #org.slf4j.simpleLogger.showThreadName=true
    
    # Set to true if you want the Logger instance name to be included in output messages.
    # Defaults to true.
    #org.slf4j.simpleLogger.showLogName=true
    
    # Set to true if you want the last component of the name to be included in output messages.
    # Defaults to false.
    #org.slf4j.simpleLogger.showShortLogName=false

    本文需要导入的架包:

    展开全文
  • Python学生管理系统(web网页版)

    万次阅读 多人点赞 2018-11-02 11:31:11
    前言:本项目是使用Python的Django的web框架搭建的,是一个完整的学生管理系统,功能包括基本的增删改查 项目演示图: 首页展示数据的页面(index.html) 添加学生的页面(add.html) 搜索学生页面(根据姓名或者...

    前言:本项目是使用Python的Django的web框架搭建的,是一个完整的学生管理系统,功能包括基本的增删改查
    项目演示图:

    首页展示数据的页面(index.html)

    在这里插入图片描述

    添加学生的页面(add.html)

    在这里插入图片描述

    搜索学生页面(根据姓名或者性别)

    在这里插入图片描述
    在这里插入图片描述

    修改学生页面(update.html)

    在这里插入图片描述

    删除学生页面(delete.html)

    在这里插入图片描述

    博文不方便记录项目,所以完整项目可以从 下载地址 下载,里面包括完整的项目源码和演示视频和数据库表的建设。

    在这里插入图片描述

    说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

    展开全文
  • 这是一个Web版本的数据库连接工具,使用Java+Angular开发,
  • Web版的超市管理系统后台网页模板

    热门讨论 2012-02-10 12:55:07
    "Web版的超市管理系统后台网页模板,貌似很熟悉的界面,最早出自动网开发的ASP新闻系统中,一直到现在都非常经典的风格,有不少朋友直接套用或模仿,本套模板是在工作之余花了一个多钟头时间整理出来的,代码中甚至...
  • 于是自己动手,用jsp写了一个web版的管理工具svn web admin,subversion web 管理工具,发布到tomcat上直接可以修改服务器的配置文件,密码都加密保存,成员也可以自己登录修改,不用什么事都来烦我了,工作效率大大...
  • web登录页面及后台管理页面,内附有静态的html源码文件,可以根据需要进行修改
  • Web管理虚拟机平台

    千次阅读 2018-09-07 19:54:22
    考虑到硬件和成本的约束,为了充分利用现有的资源和方便进行管理,需要不同的环境进行实验的时候,建立各种不同的虚拟机进行相关的实验。特别是一些大数据方面的集群实验、区块链多节点的实验、人工智能的分布式计算...

     


     

    • 一、平台目标

     随着大数据和人工智能的热潮,计算机专业学生平常做实验的环境要求也越来越复杂。考虑到硬件和成本的约束,为了充分利用现有的资源和方便进行管理,需要不同的环境进行实验的时候,建立各种不同的虚拟机进行相关的实验。特别是一些大数据方面的集群实验、区块链多节点的实验、人工智能的分布式计算等等都需要多种不同的虚拟机来进行实验和操作。

    虽然不同的虚拟机解决了不同系统和环境的需求问题,但是随着同学的增加和实验的不断扩展,大量虚拟机的管理也是一个需要解决的问题。现有的远程软件虽然可以进行登录和操作,但是当大量实验课进行的时候,太多的远程连接会消耗太多的系统资源或者难以方便快捷地进行管理,故Web虚拟机管理平台的开发势在必行。

    通过Web虚拟机管理平台,不仅可以在学校的内网进行相关的操作,把平台部署在公网服务器上,不论在何时何地,只要有网有浏览器我们就可以进行相关的学习和实验。同时,通过系统化的规划,每个相关的实验可以包含特定的虚拟机,让做实验的人单独管理,降低了管理的复杂度,同时也提高虚拟机操作的灵活性,如果不出现特殊的情况,基本可以实现自主操作和管理虚拟机。

    为了实现Web网页方式,远程Windows桌面和Linux桌面,经过一些调研和比较,选用了轻量级的开源的noVNC(http://novnc.com/info.html或者https://github.com/novnc/noVNC)技术来实现。noVNC是一个HTML5 VNC客户端,采用HTML5 websockets、Canvas和JavaScript实现,noVNC被普遍应用于各大云计算、虚拟机控制面板中,比如OpenStack, OpenNebula, LibVNCServer和 ThinLinc都用的是 noVNC。noVNC既是HTML VNC客户端、JavaScript库,也是构建在该库之上的应用程序。noVNC在任何现代浏览器中运行良好,包括移动浏览器(iOS和Android)。其特点有:

    特征

    • 支持所有现代浏览器,包括移动(iOS,Android)
    • 支持的VNC编码:raw,copyrect,rre,hextile,tight,tightPNG
    • 支持缩放,剪裁和调整桌面大小
    • 本地光标渲染
    • 剪贴板复制/粘贴
    • 主要根据MPL 2.0 获得许可,请参阅 许可文档以获取详细信息

    浏览器要求

    noVNC使用许多现代Web技术,因此无法获得正式的需求列表。但是,这些是我们目前了解的最低版本:

    Chrome 49,Firefox 44,Safari 10,Opera 36,IE 11,Edge 12

    服务器要求

    noVNC遵循标准的VNC协议,但与其他VNC客户端不同,它确实需要WebSockets支持。许多服务器都包含支持(例如 x11vnc / libvncserver, QEMU和 MobileVNC),但对于其他服务器,您需要使用WebSockets到TCP套接字代理。noVNC有一个姐妹项目websockify,它提供了一个简单的代理。noVNC提供一种在网页上通过html5的Canvas,访问机器上vncserver提供的vnc服务,需要做tcp到websocket的转化,才能在html5中显示出来。网页就是一个客户端,类似win下面的vncviewer,只是此时填的不是裸露的vnc服务的ip+port,而是由noVNC提供的websockets的代理,在noVNC代理服务器上要配置每个vnc服务,noVNC提供一个标识,去反向代理所配置的vnc服务。

    快速开始

    • 使用启动脚本自动下载并启动websockify,其中包括一个迷你Web服务器和WebSockets代理。该--vnc选项用于指定正在运行的VNC服务器的位置:

    ./utils/launch.sh --vnc localhost:5901

    • 将浏览器指向启动脚本输出的URL。点击“链接”按钮,如果VNC服务器配置了密码,请输入密码,然后享受!

     

    集成和部署

    有关如何将noVNC集成到您自己的软件中,或在生产环境中部署noVNC应用程序,请参阅我们的其他文档:

    • 嵌入 - 适用于noVNC应用程序
    •  - 适用于noVNC JavaScript库
    • 二、开发环境

    Realvnc:https://www.realvnc.com/en/ 等等

     

    • 三、开发步骤
    1. 基本环境搭建

    在主机windows10下的VMware14中安装虚拟机Windoserver2016、Ubuntu16.04、CentOS7,且Ubuntu和Cent OS都要安装图形界面,并且保证主机Windows10(192.168.1.33)、Windowsserver2016(192.168.57.129)、Ubuntu14.04(192.168.57.128)、Centos7(192.168.57.131)的网络畅通

    1. 在Windows下搭建VNC服务器
    1. 安装UltraVNC Server 并开启服务(安装后设置密码,最好三个虚拟机中的vncserver的服务密码都设置为一样:a1236540) 
    2. 安装Node.js

    安装时选择npm package manager

     

    安装ws、optimist、mime-types模块(执行websockify.js文件所需)

    C:\Users\Administrator>npm install ws

     

    C:\Users\Administrator>npm install optimist

     

    C:\Users\Administrator>npm install mime-types

     

    安装完ws、optimist、mime-types后会在C:\Users\Administrator\下生成node_modules目录(如果登录的用户是Administrator,换做其他用户的话就是:C:\Users\Jiao\node_modules)

         3.把noVNC.zip解压到node_modules目录下,再把websockify-master.zip解压到noVNC目录下,形成这样的目录结构:

       4.执行websockify.js:转发9000端口的http链接到5900端口(UltraVNC Server的默认端口为5900)C:\Users\Administrator\node_modules\noVNC\websockify-master\other\js>node websockify.js --web C:\Users\Administrator\node_modules\noVNC 9000 10.1.0.112:5900

        5.在浏览器地址栏输入http://192.168.57.129:9000/(服务器端IP:192.168.57.129)可能会提示:

    这时候只要在websockify.js中搜索filename += ‘/index.html’改成filename += ‘/vnc.html’,再重复第4、5步,出现下面的情况,证明成功连接了:

    点击“链接”输入UltraVNC设置的密码(a1236540) 完成,即可见到winserver2016的远程桌面:

    6. 在做win下相关的实验的时候我们需要输入相应的密码,不方便,可以按照以下步骤,设置win用户的自动登录:

    Win + R(运行相关的命令):control userpasswords2

     

    这时就会弹出一个用户帐户设置的窗口,在这里找到“要使用本计算机,用户必须输入用户我和密码”的设置项。

     

    我们把该设置项前面的勾选去掉,最后点击确定按钮。

     

    这时会弹出一个自动登录的默认账户设置窗口,在这里设置好用户名,然后下面输入对应的登录密码(注意必须保证和登录密码一样),最后点击确定按钮。这样以后Windows系统启动的时候,就会自动登录该账户,而不会再出现登录选择窗口了。

     

    7. 如果想不输入服务器密码和自动点击自动远程,可以添加两个参数在url中,password=a1236540(服务器密码参数)   autoconnect=true(自动登录参数) 则新的url应该为http://192.168.57.129:9000/?password=a1236540&&autoconnect=true 可以直接远程到相应的系统桌面:

    3、在Ubuntu中建立vncserver的服务器

    1. 先更新Ubuntu的软件包:sudo apt-get update
    2. 安装vnc4server:sudo apt-get  install  vnc4server
    3. 启动vnc4server服务:vnc4server    //这里会提示输入密码,就是服务器的访问密码:a1236540
    4. 安装并配置noVNC:sudo apt-get install git

    git clone https://github.com/kanaka/noVNC

                                               cd noVNC

                                               ./utils/launch.sh --vnc  127.0.0.1:5901  

                                              //127.0.0.1:为ubuntu本机的IP地址。      

                                              //5901:为目标机启动vnc4server时启动的1号服务

                                              vi vnc_token  //新建一个文件,写入要访问的目标机的相关内容     

                                             //最后启动的命令如下

                                               ./utils/websockify/websockify.py --web ./ 8844 --target-config=/home/jiao/noVNC/test.conf  

    执行上述最后一条命令后结果(要切换到noVNC目录下执行,要提前关闭防火墙):

     

    5. 测试连接Ubuntu上的网站URL为:http://192.168.57.128:8844/vnc.html?path=?token=abc789&&password=a1236540&&autoconnect=true

    说明

    192.168.57.128:8844 为主机Ubuntu的ip和vnc服务器的端口

    path=?token=abc789 为vnc_token文件中写入的目标机的名称

    password=a1236540 为Ubuntu的vncserver服务器的密码,有了这个参数,可以不用手动输入服务器的密码

    autoconnect=true :  为自动点击“链接”自动登录的参数

    测试结果为:

     

    4、Centos7中建立VNCserver服务器

    1.(如果防火墙未关闭)关闭防火墙:service  firewalld.service  stop

     

    2. 查看本机ip地址,将ip+端口,写入Ubuntu代理服务器的配置中:

     

    3. 安装git(以便下载novnc源码):yum  install  –y  git

     

    4. 安装配tigervnc: yum install tigervnc-server

     

    输入 vncserver :1 启动服务,并输入密码=a1236540(注意密码长度不小于6位,1代表的是默认端口5900+1=5901):

     

    5. 将winserver2016、centos7、ubuntu16.04都配置到代理服务器的最后的配置文件为:test.conf

     

    6. 因为虚拟机启动的时候,最好可以自动登录,方便做实验,所以要设置CentOS7启动的时候,自动登录相关的用户:

    首先,在 CentOS 7 桌面右击鼠标,选择“设置”。

     

    在设置界面中点击进入“用户”。

     

    随后,在用户窗口中,先选中你要自动登录的用户名,再点击右上角的“解锁”。

    这时,会弹出一个认证窗口,要求你输入当前用户的登录密码。密码输入完成后,点击“认证”。

     

    认证之后,我们再打开“自动登录”的开关。

     

    现在,我们在下次开机时就可以无需手动输入密码自动登录到 CentOS 7 系统了。

    7. 当不同的同学的开启不同的虚拟机做实验的时候,不能再手动去启动每个虚拟机的vncserver服务,需要在win和linux系统下,都设置为随系统启动而启动。在win下直接将Utrlvnc直接设置为自启动就可以。而在Centos下需要进行相应的设置:

    (1)创建一个新的配置文件,以开启1号窗口为例(也可以同时开启多个窗口,修改数字即可),方法如下:

    cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service

    或者再增加一个窗口:

    cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:2.service

    (2)编辑/lib/systemd/system/vncserver@:1.service,设置用户root相关参数,最终内容如下:

    上述内容中最好设置为root用户,否则可能会看到以下报错:

     

    (3)更新systemctl以使其生效systemctl daemon-reload 

    (4)设置vncserver的密码 vncpasswd root

    按提示输入密码以及确认密码

    (5)启动该服务用来启用vnc的1号窗口;

    systemctl start vncserver@:1.service  或者 vncserver :1

    关闭1号窗口:

    systemctl stop vncserver@:1.service   或者 vncserver -kill :1

    (6)设置为开机自动启动;

    systemctl enable vncserver@:1.service

    5、利用Ubuntu代理服务器访问            

    配置完三个虚拟机以后,启动三个虚拟机,winserver和centos的vncserver会直接启动,不需要特殊的处理。而Ubuntu需要启动vncserver:vncserver :1 ,然后进入noVNC目录,启动novnc:./utils/websockify/websockify.py --web ./ 8844 --target-config=/home/jiao/noVNC/test.conf  在浏览器中可以分别通过以下url直接访问三个虚拟机的远程桌面:

    WindowsServer2016:http://192.168.57.128:8844/vnc.html?path=?token=abc789&&password=a1236540&&autoconnect=true

    Ubuntu16.04:http://192.168.57.128:8844/vnc.html?path=?token=abc123&&password=a1236540&&autoconnect=true

    CentOS7:http://192.168.57.128:8844/vnc.html?path=?token=abc456&&password=a1236540&&autoconnect=true

     

    集成到JavaWeb平台

    1. 在MyEclipse10中创建JavaWeb项目——WebVMware

    • JDK用的是Myeclipse10默认的JDK1.6.0_13
    • Tomcat用的是apache-tomcat-7.0.42
    • 利用ajax技术,实现页面的局部刷新,也就是切换和管理虚拟机
    • 前端的布局直接用的bootstrap框架和js进行相关的功能控制
    • 项目的目录结构和具体的相关设置为:

     

    2. 集成noVNC功能的关键点

    • 为了通过网页来控制做实验所需要的虚拟机,就需要通过Tomcat服务器来调用VMware的命令管理方式,直接通过Java调用Win先命令的接口Runtime来直接开启和关闭相应的虚拟机,关键的代码为:
    • 为了随时切换不同的虚拟机进行相关的实验操作,需要对网页的内容进行局部刷新,所以需要通过不同的点击事件,来通过ajax去对服务器的虚拟机进行相应的操作,关键的代码为:

     

    3. 待解决的地方

    • 在win和linux的网页远程桌面操作的时候,剪贴板的功能不稳定,而且不支持文件的传输操作,需要解决
    • 在本平台的情况下,只是建立了简单的三台虚拟机进行实验。其中实用阶段的网络延迟、细节操作、权限的限制、链接的安全性和高效性都是需要我们考虑和解决的
    • 本平台在实验的过程中,参考了很多网友的博客或者帖子,再次表示感谢,参考文献中也列出了一些地址,如有错误或者不足的地方,欢迎大家讨论~

     

    参考文献

    1. noVNC在Windows下的安装配置:         http://www.zhumeng.org/thread-292491-1-1.html 
    2. win 设定 默认登录的用户名和密码:https://jingyan.baidu.com/article/fc07f989b561cd12ffe519cf.html 
    3. noVNC+VNCserver实现远程访问Docker容器桌面:https://blog.csdn.net/u012829611/article/details/72576493 
    4. CentOS 7 怎样自动登录:https://jingyan.baidu.com/article/a3761b2bc3c3771577f9aa6f.html
    5. CentOS7下安装配置vncserver/vncviewer:http://blog.51cto.com/hsuehwee/1632211  
    6. vnc与Windows、linux远程桌面实现复制和粘贴:https://blog.csdn.net/u014505990/article/details/72628243 
    7. vmrun命令行的使用(VMWare虚拟机):https://blog.csdn.net/devper/article/details/54089342 
    8. Java——调用Linux和Windows下命令行执行程序:https://blog.csdn.net/u013507760/article/details/51899723 
    9. JavaWeb 之 AJAX和其json数据的处理:https://www.cnblogs.com/jiangwz/p/7450570.html 

     

    展开全文
  • C#做的Web用户登录注册系统

    热门讨论 2011-09-14 21:51:44
    C#做的Web用户登录注册系统,这是一个登录的项目,包含三层架构以及通用实体类。
  • 问题描述 在内网中,我们已搭建文件服务,平时需要上传很多文件来与他人共享...我们需要类似文件管理器的功能来管理远程服务器的文件,简化操作。在我们认知里,只有 B/S 与 C/S 两种架构方案,既然 C/S 不行,那就寻.

    问题描述

    在内网中,我们已搭建文件服务,平时需要上传很多文件来与他人共享,或者直接允许对方直接查看下载。对于上传,我们使用 SFTP 客户端,或者那些 Chrome SFTP 扩展工具。对于下载,我们使用 Nginx 直接暴露特定目录文件列表。但是,这些工具都不是很方便。比如,需要安装客户端、Nginx 文件列表页不够美观、操作比较繁琐、不能直接预览文件等等。

    我们需要类似文件管理器的功能来管理远程服务器的文件,简化操作。在我们认知里,只有 B/S 与 C/S 两种架构方案,既然 C/S 不行,那就寻找 B/S 方案。在这里,便是寻找基于网页的文件管理器。(其实换个角度,如果 C/S 架构能够解决我们的问题,那它必须是打开后能够直接管理服务器文件的,但是我们还会使用 Windows 操作系统,这里没有跨平台的方案。并且也不是每个人都熟悉 SFTP 的使用方法,在用户体验上终究比不上网页端的“登录后便可以用”的特点)

    该笔记将记录:如何使用基于网页的文件管理器,来管理服务器中的文件,以及一些常见的问题。

    补充说明

    很多文件管理器客户端,支持 fuse 特性(比如 PCManFM 可以通过 SSH 挂在远程文件系统)。但是,使用和管理依旧不是很方便,比如不能跨平台、需要配置等等。

    解决方案

    File Browser(正在使用)

    filebrowser/filebrowser: 📂 Web File Browser

    # 02/07/2021 这是我们正在使用的文件管理系统,详细介绍参考 File Browser 笔记。

    1)支持 Guest 访问,即无需设置帐号即可访问;
    2)支持视频播放(基本等同于浏览器播放,所以需要浏览器支持的视频格式);

    pasted_image003.png

    FileRun

    FileRun - File Manager

    另一个网页版的文件管理器,还附带了多平台的客户端。是一个不错的选择,也分为 Free Version 与 Enterprise Version。
    1)支持 Guest 访问,即无需设置帐号即可访问;
    2)支持文档在线预览;

    pasted_image002.png

    Tiny File Manager

    prasathmani/tinyfilemanager: The best web based PHP File Manager in single file, Manage your files efficiently and easily with tinyfilemanager

    演示站点:https://tinyfilemanager.github.io/demo/

    1)Google/Microsoft doc viewer helps you preview PDF/DOC/XLS/PPT/etc.
    2)可以进行文本的编辑;

    tinyfilemanager.github.io_demo_.png

    eXtplorer File Manager

    eXtplorer - a PHP-based File Manager

    Web 版的文件管理器。通过浏览器来管理服务器上的文件。当然,要具有适当的权限。eXtplorer File Manager项目主页

    pasted_image004.png

    Cloudreve

    GitHub项目地址

    国产的Web文件管理器,使用ThinkPHP框架开发。

    KodExplorer

    kalcaddle/KodExplorer: A web based file manager,web IDE / browser based code editor

    功能比较丰富,但是付费版本的功能更多。我们没有使用过,这里只是简单记录。

    相关文章

    「File Browser」- 基于网页的文件管理器

    参考文献

    File Browser - A Cross-platform Stylish Web File Manager - OSTechNix

    展开全文
  • RTXWEB管理系统 V2.0 2013-08-04 + 新功能 - 用户管理 增加快速删除用户,输入账户即可删除; - 分级管理员 增加分级管理员功能,下级管理可以再增加下一级管理员; - 群管理 增加创建群功能,各级管理员可以...
  • VisualSVN Server Web管理工具

    热门讨论 2013-03-21 23:51:22
    VisualSVN Server只提供控制台的管理,建库,建用户,权限什么的都得在服务器上操作,写了个web管理,用了ext界面,有部分功能还在完善当中
  • oracle网页登录管理

    万次阅读 2018-07-03 14:37:43
    应用云服务化是大势所趋,在云服务器上面的Oracle数据库,通过网页方式管理维护是主流的趋势,安装TreeSoft可以实现一次布署,到处访问的要求,大大降低管理的成本。...1、基于web网页方式,管理...
  • 点击webComponents.exe安装 注意版本号和 32位 64位(这里跟正一下 木有64位尴尬尴尬) 如果没有合适的 请去官网下载 第二步:将文件夹中 demo.js demo.css webVideoCtrl.js 这3个文件导入你的项目,还...
  • 现在很多的华三交换机和路由器默认已经自带了WEB图形界面,只需要电脑配置一个互通的ip地址连接后就能登录web界面,操作管理起来非常方便。但有时某些是没有开启web界面的,下面就以华三模拟器交换机为例操作配置...
  • Web进销存管理系统源代码

    热门讨论 2012-01-02 15:33:57
    资源描述:安装说明: 把程序复制到虚拟主机上就可以了。 1.虚拟主机要求装有IIS5.0或6.0 并支持access ...管理员admin 密码admin 数据库连接修改 dbconn.asp dbname="data/red#jxc.mdb" 改为要的数据库名称就可以了。
  • WEB前端实战——制作登录页面

    千次阅读 2021-01-31 10:02:15
    参考视频:https://ke.qq.com/course/320021 代码 <!DOCTYPE html> <html lang="en"> <...登录页面</title> <style> body { background-image: url("img/星空.jpg");
  • 出现exsi通过浏览器无法访问web管理页面,ping exsi的静态网址时是可以ping通的。之前几天是可以登录的。 开始以为是exsi的设置问题,强行开关机和各种设置几次,没能解决问题,后来用同学电脑试了一下,竟然是可以...
  • java web 18种登录页面模板

    热门讨论 2014-05-28 11:09:42
    登录模板,java web 18种登录页面模板,很好很强大
  • 华为 S5700 web管理加载文件

    热门讨论 2011-11-22 15:26:25
    华为 S5700 web管理加载文件 http server load S5700SI-V100R005.002.web.zip http server enable
  • 通过WEB页面实现一个简单的文件管理器,可以使用浏览器来管理服务器上所有磁盘下的文件和目录。 实现:文件和目录遍历;文件和目录的删除(单选、多选)、改名;目录的建立;文件的上传下载,所有目录和文件对应图标...
  • 配置通过Web网管登录交换机示例(V200R005版本 ...用户可以从终端通过HTTPS登录Web网管,利用Web网管对交换机进行管理和维护。 Web网管支持易维版和经典版两种版面。 易维版采用丰富的图形和更...
  • WEB页面登陆管理 H3C设备

    千次阅读 2020-11-18 22:32:44
    以H3C S2126,H3C S3552为例,...[H3C]interface Vlan-interface 2100(进入管理VLAN接口,这里的管理vlan是2100) [H3C-Vlan-interface2100] undo ip address(取消管理VLAN原有的IP地址) [H3C-Vlan-interface...
  • 华为交换机开启web管理

    万次阅读 多人点赞 2019-01-09 09:16:28
    华为S2300/3300交换机不含web网页文件,需手动上传。 Web文件下载地址http://download.csdn.net/download/flyhorstar/4929194 开启步骤如下: 开启交换机ftp功能,设置ftp用户名和密码 System-view //进入系统...
  • web项目用户角色管理

    千次阅读 2017-07-06 14:07:02
     任何一个web项目,按照是否有会员(用户)登陆划分,可以分为有会员网站和无会员网站,无会员网站结构简单内容单一,有会员网站结构复杂内容丰富。  对于有会员登陆的产品而言,项目整体的用户管理配置功能是...
  • rocketmq web-console 管理界面war包

    热门讨论 2016-04-07 15:00:37
    rocketmq管理界面,下载发布到tomcat下,修改config.properties中的rocketmq.namesrv.addr参数即可。该参数为nameserver的地址
  • 一步一步实现web程序信息管理系统 在web程序中特别是信息管理系统,登陆功能必须有而且特别重要。每一个学习程序开发或以后工作中,都会遇到实现登陆功能的需求。而登陆功能最终提供给客户或展现给客户的最基本的...
  • 先创建一数据库,登录有动态ASP页面和HTML页面,注册页面类似,注册成功后把数据提交到数据库,再在登录页面可以登录成功
  • nas不能登录web怎么办?

    千次阅读 2019-12-28 01:03:48
    结果最近居然发现不能通过web登录了,该怎么办呢?   一、经过日志分析,发现是磁盘空间满了。  不能web登录的问题出现了有几天了,但一直没有时间去仔细研究。多次采用重启大发也未能解决这个问题。问了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 282,954
精华内容 113,181
关键字:

如何登录web管理网页