文档章节

ssh登录实现

c
 caiyezi
发布于 2016/11/08 20:24
字数 2009
阅读 6
收藏 0
点赞 0
评论 0

工程目录

配置文件详解

Spring的applicationContext.xml文件
<span ><?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:aop="http://www.springframework.org/schema/aop"   
    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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">    
  
    <!-- 定义数据源 -->
    <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>
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 配置HibernateSessionFactory工厂 -->  
    <bean id="sessionFactory"  
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource"></property>  
        <property name="configLocation" value="classpath:hibernate.cfg.xml"/>  
        <!-- 自动扫描注解方式配置的hibernate类文件 -->  
        <property name="packagesToScan">  
            <list>
                <value>com.tonly.entity</value>  
            </list>  
        </property>  
    </bean>  
  
    <!-- 配置Hibernate事务管理器 -->  
    <bean id="transactionManager"  
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory" />  
    </bean>  
  
    <!-- 配置事务传播特性 -->  
    <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="insert*" propagation="REQUIRED" />  
            <tx:method name="update*" propagation="REQUIRED" />  
            <tx:method name="edit*" propagation="REQUIRED" />  
            <tx:method name="save*" propagation="REQUIRED" />  
            <tx:method name="add*" propagation="REQUIRED" />  
            <tx:method name="new*" propagation="REQUIRED" />  
            <tx:method name="set*" propagation="REQUIRED" />  
            <tx:method name="remove*" propagation="REQUIRED" />  
            <tx:method name="delete*" propagation="REQUIRED" />  
            <tx:method name="change*" propagation="REQUIRED" />  
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />  
            <tx:method name="*" propagation="REQUIRED" read-only="true" />  
        </tx:attributes>  
    </tx:advice>  
    
      <!--  配置参与事务的类 -->
    <aop:config>
        <aop:pointcut id="serviceOperation" expression="execution(* com.tonly.service.*.*(..))" />  
            <!-- 切面事务归txAdvice处理,把上面我们所配置的事务管理两部分属性整合起来 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
    </aop:config>
  
    <!-- 自动加载构建JavaBean,直接使用注解的话可以免去配置bean的麻烦,实体类可以被自动扫描 -->  
    <context:component-scan base-package="com.tonly" /> 
  
</beans>  </span>
Hibernate.cfg.xml文件配置
<span ><?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
  
<hibernate-configuration> 
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>  
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
    </session-factory>  
</hibernate-configuration></span>
jdbc.properties文件配置
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_teststudio
jdbc.username=root
jdbc.password=123
struts.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC  
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
    "http://struts.apache.org/dtds/struts-2.3.dtd">  
     
<struts>  
    <constant name="struts.action.extension" value="action" />
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <constant name="struts.multipart.maxSize" value="10000000"/>  <!-- 大约10M -->
    
    <package name="ebuy" namespace="/" extends="struts-default">
            
        <action name="user_*" method="{1}" class="com.tonly.action.UserAction">
            <result name="error">login.jsp</result>
            <result name="loginSuccess">main.jsp</result>
        </action>
        
    </package>
    
</struts>
login.jsp文件,主要实现登录(输入用户名、密码)、记住密码功能,比较简单,前台jsp页面使用bootstrap框架,界面效果如下:
用户名或密码为空:
用户名或密码不正确:
 
登录成功,直接跳到main.jsp页面:
 
前台login.jsp文件详细如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ page import="com.tonly.entity.User"%>
<%
    if(request.getAttribute("user") == null){//说明是用户首次登录,而非服务端跳转,这时候再在cookies中进行取值操作
        String userName = null;
        String password = null;
        Cookie[] cookies = request.getCookies();
        for(int i=0; cookies!=null && i<cookies.length; i++){
            if(cookies[i].getName().equals("user")){
                userName = cookies[i].getValue().split("-")[0];
                password = cookies[i].getValue().split("-")[1];
            }
        }
        if(userName == null)
            userName = "";
        if(password == null)
            password = "";
        pageContext.setAttribute("user", new User(userName, password));//EL表达式取值范围为page request session application
    }
%>
<html lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DQA - Test Studio</title>
<link
    href="${pageContext.request.contextPath}/bootstrap/css/bootstrap.css"
    rel="stylesheet">
<link
    href="${pageContext.request.contextPath}/bootstrap/css/bootstrap-responsive.css"
    rel="stylesheet">
<script src="${pageContext.request.contextPath}/bootstrap/js/jquery.js"></script>
<script
    src="${pageContext.request.contextPath}/bootstrap/js/bootstrap.js"></script>
<style type="text/css">
    body {
        padding-top: 10px;
        padding-bottom: 40px;
        background-color: #D6D6D6;
    }
    .form-signin-heading {
        text-align: center;
        padding-bottom: 10;
    }
    .head{
        width:100%;
        height:200px;
    }
    .form-signin {
        max-width: 390px;
        padding: 19px 29px 0px;
        margin: 0 auto 20px;
        background-color: #fff;
        border: 1px solid #e5e5e5;
        -webkit-border-radius: 5px;
        -moz-border-radius: 5px;
        border-radius: 5px;
        -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
        -moz-box-shadow: 1 1px 2px rgba(0, 0, 0, .05);
        box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
    }
    
    .form-signin .form-signin-heading,.form-signin .checkbox {
        margin-bottom: 10px;
    }
    
    .form-signin input[type="text"],.form-signin input[type="password"] {
        font-size: 12px;
        height: 13px;
        margin-bottom: 15px;
        padding: 7px 9px;
        width:100%;
    }
</style>
<script type="text/javascript">

    function resetForm(){
        $("#userName").val("");
        $("#password").val("");
    }
    
    function checkForm(){
        var userName = $("#userName").val();
        var password = $("#password").val();
        if(userName == ""){
            $("#error").html("Please enter username");
            return false;
        }
        if(password == ""){
            $("#error").html("Please enter password");
            return false;
        }
        return true;
    }
    
</script>
</head>
<body>
    <div id="head" class="head">
        <div >
            <font size=6 color="#E50914"> </font>
        </div>
        <div >
            <hr size=12 color=#E50914 width=100%>
        </div>
    </div>
    <div class="container">
        <form name="myForm" class="form-signin" action="user_login.action" method="post" onsubmit="return checkForm()">
            <h2 class="form-signin-heading">Welcome to Test Studio</h2>
            <input id="userName" name="user.userName" type="text"
                value="${user.userName }" class="input-block-level"
                placeholder="Username"> <input id="password" name="user.password"
                type="password" value="${user.password }" class="input-block-level"
                placeholder="Password"> <label class="checkbox"> <input
                id="remember" name="remember" type="checkbox" value="remember-me">Remember me
                     <font id="error" color="red">${error}</font>
            </label>
            <div  align="center">
                <button class="btn btn-default btn-primary" type="submit">Login</button>
                    
                <button class="btn btn-default btn-primary" type="button" onclick="javascript:resetForm()">Reset</button>
            </div>
            <br>
        </form>
    </div>
</body>
</html>

详细代码实现:

首先是service服务层,结构如下:
其中UserServiceImpl的具体实现如下:
package com.tonly.service.impl;

import java.util.LinkedList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.tonly.dao.BaseDao;
import com.tonly.entity.PageBean;
import com.tonly.entity.User;
import com.tonly.service.UserService;
import com.tonly.util.StringUtil;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource
    private BaseDao<User> baseDao;
    
    @Override
    public User login(User user) {
        List<Object> param = new LinkedList<Object>();
        StringBuffer hql = new StringBuffer("from User u where u.userName = ? and u.password = ?");
        if (user != null) {
            param.add(user.getUserName());
            param.add(user.getPassword());
            return baseDao.get(hql.toString(), param);
        }else {
            return null;
        }
    }
    
}
通过@Service("userService")注解声明一个服务bean,通过@Resource注入baseDao这个bean,BaseDao的实现结构如图:
其中BaseDaoImpl的具体实现如下:
package com.tonly.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.tonly.dao.BaseDao;
import com.tonly.entity.PageBean;

@Repository("baseDao")
@SuppressWarnings("all")
public class BaseDaoImpl<T> implements BaseDao<T> {
    
    private SessionFactory sessionFactory;
    
    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    private Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    
    public T get(Class<T> c, Serializable id) {
        return (T) this.getCurrentSession().get(c, id);
    }

}
BaseDaoImpl中使用了泛型注入,这样在service层可以直接通过注入basedao并传递一个类型对象的方法实现basedao中方法的继承。再来看看UserServiceImpl的具体实现:
package com.tonly.service.impl;

import java.util.LinkedList;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.tonly.dao.BaseDao;
import com.tonly.entity.PageBean;
import com.tonly.entity.User;
import com.tonly.service.UserService;
import com.tonly.util.StringUtil;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource
    private BaseDao<User> baseDao;
    
    @Override
    public User login(User user) {
        List<Object> param = new LinkedList<Object>();
        StringBuffer hql = new StringBuffer("from User u where u.userName = ? and u.password = ?");
        if (user != null) {
            param.add(user.getUserName());
            param.add(user.getPassword());
            return baseDao.get(hql.toString(), param);
        }else {
            return null;
        }
    }
    
}
这里直接通过@Resource注入baseDao并传递泛型参数"User",这样可以直接使用baseDao.get(hql.toString(), param)方法获取对象。
最后记录下UserAction的具体实现:
package com.tonly.action;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;
import com.tonly.entity.User;
import com.tonly.service.UserService;

@Controller
public class UserAction extends ActionSupport implements ServletRequestAware{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private HttpServletRequest request;
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
    
    @Resource
    private UserService userService;
    private String error;
    private User user;
    private String remember;
    
    public String getRemember() {
        return remember;
    }
    public void setRemember(String remember) {
        this.remember = remember;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    
    public String getError() {
        return error;
    }
    public void setError(String error) {
        this.error = error;
    }
    
    public String login() throws Exception{
        HttpSession session = request.getSession();
        User currentUser = userService.login(user);
        if (currentUser == null) {
            request.setAttribute("user",user);
            error = "incorrect username or password";
            return ERROR;
        }else {
            if ("remember-me".equals(remember)) {
                remember(currentUser, ServletActionContext.getResponse());
            }
            session.setAttribute("currentUser", currentUser);
            return "loginSuccess";
        }
    }
    
    private void remember(User user, HttpServletResponse response) throws Exception{
        Cookie cookie = new Cookie("user", user.getUserName()+"-"+user.getPassword());
        cookie.setMaxAge(1*60*60*24*7);//设置有效期一周
        response.addCookie(cookie);
    }
    
}
实体User类具体代码如下:
package com.tonly.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="t_user")
public class User {
    
    private int id;
    private String userName;
    private String password;
    private String sex;
    private String email;
    private String mobile;
    private String address;
    private int status = 1; //普通用户为1,管理员为2
    
    public User() {
        super();
    }
    public User(String userName, String password) {
        super();
        this.userName = userName;
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getStatus() {
        return status;
    }
    public void setStatus(int status) {
        this.status = status;
    }
    @Id
    @GeneratedValue(generator="_native")
    @GenericGenerator(name="_native",strategy="native")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    @Column(length=20)
    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;
    }
    
}
整个业务逻辑是:
前台login.jsp登录请求user_login.action,通过struts的OGNL方式直接将userName、password自动封装到后台action中的User对象,登录操作之后返回一个currentUser对象(用户名或密码不正确则对象为空),如果为空,则将当前User对象(前台传过来的错误User对象)置于request范围中,这样可以直接在前台通过value="${user.userName}或password="${user.password}""的方式直接回显数值。如果登录成功则再判断有没有勾选"Remember me",如果勾选则表示要求记住密码,则将当前登录成功的currentUser对象置入cookie中,这样前台脚本中可以通过判断再次取值的方式实现记住密码。

本文转载自:http://www.cnblogs.com/vipzhou/p/4765510.html

共有 人打赏支持
c
粉丝 1
博文 108
码字总数 0
作品 0
西安
程序员
4、Linux下ssh的使用!

1:查看系统是否已经安装了ssh套件,或则系统是否已经启动了ssh服务 2:生成密钥。 在当前用户的主目录下生成密钥,并且放在一个.ssh的文件夹中。 1:生成密钥 ssh-keygen -t rsa -f ~/.ssh/id...

刘付kin ⋅ 2016/12/08 ⋅ 0

Git : SSH 协议服务器

SSH协议语法格式 对于拥有 shell 登录权限的用户账号,可以用下面的语法访问 Git 版本库: 语法 1 : ssh://[@][:]/home/xxx/repo1.git 语法 2 : [@]:/home/xxx/repo1.git 注意 : SSH 协议地址...

wudized ⋅ 2017/07/10 ⋅ 0

Git : SSH 协议服务器

SSH协议语法格式 对于拥有 shell 登录权限的用户账号,可以用下面的语法访问 Git 版本库: 语法 1 : ssh://[@][:]/home/xxx/repo1.git 语法 2 : [@]:/home/xxx/repo1.git 注意 : SSH 协议地址...

wudized ⋅ 2017/07/10 ⋅ 0

Git : SSH 协议服务器

SSH 协议用于为 Git 提供远程读写操作,是远程写操作的标准服务。 SSH协议语法格式 对于拥有 shell 登录权限的用户账号,可以用下面的语法访问 Git 版本库: 语法 1 : ssh://[@][:]/home/xx...

llljj96 ⋅ 2017/05/23 ⋅ 0

Shell脚本实现ssh免密登录及批量配置管理

本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里、腾讯那样,动不动就上亿的PV量,上万台服务器。我...

vincenteve ⋅ 2017/10/08 ⋅ 0

ubuntu ssh 设置

网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务。最终成功的方法如下:   ...

Koala_Bear ⋅ 2012/07/14 ⋅ 0

Ubuntu 下 SSH 设置

网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务。最终成功的方法如下: Ub...

鉴客 ⋅ 2011/07/14 ⋅ 1

SSH无需密码密钥登录

无密码ssh登录的主要操作简单概述为,将本机中的ssh密钥对中的公钥如idrsa.pub拷贝到目标机器的ssh验证文件authorizedkeys中。 1、简洁操作步骤 摘录一 :使用ssh-copy-id 在192.168.42.142机...

无明时空 ⋅ 2012/09/18 ⋅ 0

[转]SSH原理及应用

SSH是每一台Linux电脑的标准配置。 虽然本文内容只涉及初级应用,较为简单,但是需要读者具备最基本的"Shell知识"和了解"公钥加密"的概念。如果你对它们不熟悉,我推荐先阅读《UNIX / Linux ...

RickyHuL ⋅ 2017/12/26 ⋅ 0

SSH原理与应用(一):远程登录

转载自http://www.ruanyifeng.com/blog/2011/12/sshremotelogin.html SSH原理与应用(一):远程登录 作者: 阮一峰 日期: 2011年12月21日 SSH是每一台Linux电脑的标准配置。 随着Linux设备...

Lubby ⋅ 2015/11/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部